惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
博客园_首页
宝玉的分享
宝玉的分享
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
T
Tailwind CSS Blog
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
罗磊的独立博客
F
Fortinet All Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
D
DataBreaches.Net
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Scott Helme
Scott Helme
B
Blog
M
MIT News - Artificial intelligence
K
Kaspersky official blog
H
Help Net Security
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】
L
Lohrmann on Cybersecurity
P
Privacy & Cybersecurity Law Blog
Project Zero
Project Zero
The Hacker News
The Hacker News
B
Blog RSS Feed
T
Tor Project blog

博客园 - hzman

ASP采集入库生成本地文件的几个FUCTION 用XMLhttp编写web采集程序 无需安装软件架设NOD32升级服务器指南! 架设NOD32升级服务器 - hzman - 博客园 C#游戏外挂代码 ini文件操作类 OllyDBG 入门系列(二)-字串参考 OllyDBG 入门系列(一)-认识OllyDBG - hzman - 博客园 live.cn邮箱注册帐号方法 - hzman - 博客园 免手机验证码网站备案 ASP同一虚拟空间放多个站点(各站点对应独立域名)的方法 QQ空间代码说明 页面间传值方法 C#代码,功能为拦截http请求,并篡改其中任何内容 C#编写NotifyIcon 深入浅出之正则表达式 两个分析HTML网页的方法 提取HTML代码中文字的C#函数 c#字符串截取函数
VC7转换到VC8的常见问题
hzman · 2007-10-12 · via 博客园 - hzman

从总体上说VC8比VC7.1语法上严格且严谨。文中只涉及到编译问题,链接的问题没有包含在内。
1. 变量作用域
在vc7.1中, 如果一个变量定义在for语句的条件从句中,那么这个变量可以在for之后使用。但Vc8禁止这样,会报告一个C2065错误.

for (int i = 0; i < 10++i)  
{                             
   
//codes here
}

if (i < 10).. //error in Vc8
for (i = 0; i < 5++i) //error in Vc8

解决方法:
在for语句之前声明变量(可保证代码在vc7.1和vc8下同时编译通过)

int i =0;                    
for (i = 0; i < 10++i)
for (i = 0; i < 5++i)

2. 指针和引用的声明
在Vc7.1中, 下面的代码可以编译, 但是vc8会报C4430 错误。(很难想象有些美国程序员竟然这样声明)

const & int a; //error in VC8
const * int b;  //error in VC8
int myfun (const & B); //error in VC8

解决方法:
把* 或&放到类型的后面.

const int& a; 
const int* b;
int myfun (const B&);

3. 默认int类型
在vc7.1中,如果定义一个变量但不声明类型,那么默认为int。VC8不支持。

static i = 0// C4430 error in Vc8 
const i = 0//C4430 error

解决方法:
加上int.

static int i = 0
const int i = 0;

4. 函数的默认返回值类型
同上,VC8不支持把 int 作为默认返回值类

Func()
{return 0;}//error in VC8

解决方法:
明确声明函数返回值类型为 int.

int Func()
{return 0;};

5. 函数地址
Vc7中函数名就是地址。在vc8中,必须要使用&操作符同时写出这个方法的全名(fully qualified name).

class A
{
public:
     
int Test(void);
}
;
void fun(int (A::*test) (void));
int main() 
{
     fun(A::Test);
//C3867 error in VC
     return 0;
}

解决方法:
加上 &.

fun(&A::Test);

6. 隐式类型转换
VC8不允许B* 到const B*&的隐式转换.

class B{};
void fun ( const B* & );//if possible use const B* instead
int main() 
{
*test = new B();
fun (test); 
//error in VC8
return 0;
}

解决方法:
强制转换或函数参数变成const B*。

void fun ( const B*  );

7. 友元方法(Friend function)
VC8不允许声明一个private或protected函数为友元.

class A
{
private:
 
void c();  
}
;
class B
{
  friend 
void A::c(); //C2248 error, c() is invisible to class B.
}
;

解决方法 1:
声明友元类.

class A
{
private:
 
void c();  
}
;
class B
{
  friend 
class A;
}
;

解决方法 2:
把函数声明为public

class A
{
public:
 
void c();  
}
;
class B
{
  friend 
void A::c();
}
;

8. STL的stdext 命名空间
在vc8中,hash_map 和hash_set 被移进了stdext命名空间中.

#include <hash_map>
std::hash_map 
//error in VC8

解决方法:
使用stdext 命名空间.

#include <hash_map>
stdext::hash_map

9. 头文件
许多头文件如fstream.h 和iostream.h在VC8中已经不存在了.

#include <fstream.h> //error in VC8

解决方法:
使用STL.

#include <fstream>

10. Iterator
一些 STL 类, iterators 不再用指针实现

std::vector<DMDetailRow> m_data;
std::vector
<DMDetailRow>::iterator iter = &m_data[rowNum];

解决方法:

std::vector<DMDetailRow>::iterator Iter = m_data.begin() + rowNum;

11. Enum
使用一个Enum的成员时,不要使用enum的名字

enum E
{
  a,b,c
}
;
E e1 
= E::a; //warning in VC8

解决方法:
去掉Enum 的名字.

E e1 = a;