《Visual C++ 2010 入门教程》系列四:VC2010 中初学者常见错误、警告和问题 2010 年 06 月 27 日 星期日 上午 11:21 这一章将帮助大家解释一些常见的错误、警告和问题,帮助大家去理 解和解决一些常见问题,并了解它的根本原因。
iostream.h 与
下面的代码为什么在 VC2010 下面编译不过去? #include int main() { cout<<"Hello World."<xml:namespace prefix = endl; return 0; } 错误信息:fatal error C1083 />头文件来代替,你甚至可以认为 是这样定义的: namespace std { #include "iostream.h" } 因此我们可以简单的修改我们的 Hello World。 #include using namespace std; int main() { cout<<"Hello World."< return 0; } iostream.h 是属于 C++的头文件,而非 C 的,因此标准订立的时候被改 成了。而 C 的头文件 stdio.h 等依然可以继续使用,这是为了兼容 C 代码。 但是它们依然有对应的 C++版本, 如 等。 记住, VC2010 在 上面采用 C++风格的头文件而不是 C 风格的头文件,除非你是在用 C。
warning C4996
这是一个警告,请看下面的代码: #include using namespace std; int main() { char sz[128] = {0}; strcpy( sz, "Hello World!" ); cout<< sz << endl; return 0; } 上面的 strcpy 会产生这个警告: warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 这是因为 VC 从 2005 版本开始,微软引入了一系列的安全加强的函数来 增强 CRT(C 运行时),这里对应的是 strcpy_s。_s 意为 safe 的意思,同样的 道理,strcat 也是同样。因此要解决这个问题,我们可以用 strcpy_s 来替换 strcpy,但是注意 strcpy_s 并非所有编译器都提供,因此如果要跨编译器,请 采用错误信息中所提示的方式,定义_CRT_SECURE_NO_WARNINGS 宏来掩耳盗铃 吧。另外注意并非所有的加强函数都是在屁股后面加_s,比如 stricmp 这个字符 串比较函数的增强版名字是_stricmp。下面,用 strcpy_s 来更改程序: int main() { char sz[128] = {0}; strcpy_s( sz, "Hello World!" ); cout<< sz << endl;
char* pSz2 = new char[128]; strcpy_s( pSz2, 128, "hello"); cout<< pSz2 << endl; delete pSz2; return 0; } 注意,strcpy_s 有两个版本,一个可以帮助我们自动推断缓冲区的大 小,而另外一个不能帮助我们推断,因此在编译器不能推断缓冲区大小
的时候, 我们需要自己指定缓冲区的大小,如上面的程序所演示的那样,关于增强版的函 数请参考我写的《深入学习 C++ String2.1 版》。 《
TCHAR、wchar_t、 TCHAR、wchar_t、char
请大家看下面这个程序: #include #include #include using namespace std; int main() { MessageBox( NULL, "你好 HelloWorld!", "Information", 0 ); return 0; } 貌似没什么问题吧?错了,如果你是按照我教你的方法创建的控制台空 工程的话,那么会有编译错误: error C2664: “MessageBoxW”: 不能将参数 2 从 “const char [17]”转换为“LPCWSTR” 这个问题太普遍了,几乎所有的初学者都会遇到而且感到难以应付,因 为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程 序在 VC6 下面应该是没有任何问题的,那问题出现在哪里呢?问题在这里,请右 键单击解决方案浏览器下面的项目,属性,
问题的根本就是字符集问题,在 VC6 中,我们默认使用的是多字节字符 集,而现在我们