標籤:
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函數在輸出時,只會輸出第一個字元。
Visual Studio的Unicode和ASCII