《面向对象程序设计》实验指导书(修订日期:2015.11.18) - 图文(7)

2019-08-03 14:53

namespace std {

#include \ }

因此我们可以简单的修改我们的Hello World。 #include

using namespace std;

int main() {

cout<<\

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, \cout<< sz << endl;

29

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, \cout<< sz << endl;

char* pSz2 = new char[128]; strcpy_s( pSz2, 128, \cout<< pSz2 << endl; delete pSz2; return 0; }

注意,strcpy_s有两个版本,一个可以帮助我们自动推断缓冲区的大小,而另外一个不能帮助我们推断,因此在编

30

译器不能推断缓冲区大小的时候,我们需要自己指定缓冲区的大小,如上面的程序所演示的那样,关于增强版的函数请参考《深入学习C++ String2.1版》。 TCHAR、wchar_t、char 请大家看下面这个程序: #include #include #include using namespace std;

int main() {

MessageBox( NULL, \你好HelloWorld!\return 0; }

貌似没什么问题吧?错了,如果你是按照我教你的方法创建的控制台空工程的话,那么会有编译错误:

error C2664: “MessageBoxW”: 不能将参数 2 从“const char [17]”转换为“LPCWSTR”

这个问题太普遍了,几乎所有的初学者都会遇到而且感到难以应付,因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6下面应该是没有任何问题的,那问题出现在哪里呢?问题在这里,请右键单击解决方案浏览器下面的项目,属性,

31

问题的根本就是字符集问题,在VC6中,我们默认使用的是多字节字符集,而现在我们默认需要的是UNICODE字符集,简单的,我们把这个字符集改成多字节字符集这个问题就解决了:

再试试应该就可以了吧?但是我并不推荐大家这么做,因为让自己的程序适应各种字符集是我们写代码的人义不容辞的义务。

我们把程序改成下面这样: #include #include #include using namespace std;

32

int main() {

MessageBox( NULL, TEXT(\你好HelloWorld!\ TEXT(\

MessageBox( NULL, _T(\你好HelloWorld!\_T(\return 0; }

用两个宏TEXT或者_T都可以解决这个问题,它们两个并没有太大区别,也许区别在于前者是通过windows.h头文件引入的,而_T是通过tchar.h引入的,我推荐大家使用_T和tchar.h,因为tchar.h还帮助我们引入了其它一些很有用的宏,比如_tcscpy_s,这个宏在使用UNICODE字符集的时候被替换成wcscpy_s,在使用多字节字符集的使用被替换成strcpy_s。关于这部分的内容,请大家不要错过《Windows核心编程》的第二章(第四版或第五版都可以),以及《深入学习C++ String2.1版》。 它们都有提到。 有人听说_T可以把多字节字符串转换成UNICODE,因此他写了如下的代码:

const char* pStr = \哈哈\

MessageBox( NULL, _T(pStr), _T(\ 当然,除非你运气好的抓狂,否则你是编译不过去的,为什么呢?我们现在应该知道对于\这样的字符串,VC2010会默认的将它视为const char*,即多字节字符串,而L\前面有个L前缀的被视为UNICODE字符串,这和C#是有区别的,因为C#的字符串总是被视为UNICODE,C++/CLI下面编译器也会帮助我们做到这件事情,所以它们不需要L(C++/CLI兼容L这种写法)。 让我们看看_T的定义吧:

#define wxCONCAT_HELPER(text, line) text ## line

33


《面向对象程序设计》实验指导书(修订日期:2015.11.18) - 图文(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浅淡中学美术教育

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: