Visual Studio的Unicode和ASCII
Visual C++自2005版之后,工程的默认字符集属性改为使用宽字符集(Unicode),因此默认情况下不应使用多字节字符集(ASCII)。
这个改动让我们从网上、书上等处获取的代码无法正常编译。例如下面这个基于控制台、获取文件绝对路径的程序。
#include<windows.h> #include<stdio.h> int main() { char szDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szDir); printf("The Current Directory is %s",szDir); getchar(); return 0; }
在2005以后的Visual C++版本中,由于默认使用了Unicode,该程序无法正常编译。
解决办法有很多:
方法一:(推荐)
使用Unicode的类型、函数。本例中将类型char变为TCHAR,函数printf改为wprintf,字符串的前面加L,或用放在_T( )的括号中。如下:
#include<windows.h> #include<stdio.h> int main() { TCHAR szDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szDir); wprintf(L"The Current Directory is %s",szDir); getchar(); return 0; }
方法二:(推荐)
不修改源代码,而去修改编译器的设置。
右键“项目”—“属性”—“常规”—“字符集”(由默认的Unicode字符集改为“未设置”或“多字节字符集”)
方法三:(不推荐)
把函数改为ASCII的函数。如将GetCurrentDirectory改为GetCurrentDirectoryA。
另外,编译无法通过时通常提示类型转换方面的错误信息。比如,提示不能将参数 2 从“char [260]”转换为“LPWSTR”。如果此时将char类型字符串强制转换成LPWSTR类型,由于Unicode中每个字符占2个字节,ASCII中每个字符占一个字节,printf函数在输出时,只会输出第一个字符。