1. WINVER not defined. Defaulting to 0x0600 (Windows Vista)
如果沒有定義WINVER,預設的支援作業系統版本為Vista,可以在工程設定中增加WINVER=0x500;_WIN32_WINNT=0x500; 定義支援的作業系統版本為Win2000。
2. warning C4996: 'strcpy': This function or variable may be unsafe.
C4996的警告是針對C語言中不安全的字串函數提出的,可以在工程設定中增加宏_CRT_SECURE_NO_WARNINGS來取消這一類的警告。
3. warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa.
根據ISO C++標準,itoa應當為_itoa。在vs2010下,如果我們把itoa改為_itoa時,編譯器照樣會在進行警告,告訴我們應該使用_itoa_s來代替_itoa
可以想象,C++標準函數正在逐步向安全性轉變
類似的警告有:
warning C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strupr
warning C4996: 'strlwr': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strlwr
4. warning LNK4017: DESCRIPTION statement not supported for the target platform; ignored
VC9的連接器不再支援.def檔案中的DESCRIPTION。
5. warning C4244: '=' : conversion from '__time64_t' to 'long', possible loss of data
CTime::GetTime()返回的是__time64_t類型了。
VC9的MFC一些函數傳回型別都改成__int64了。
6. warning C4996: 'ATL::CRegKey::QueryValue': CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue
CRegKey有了很多新成員,針對不同的資料類型都有相應的方法:
QueryBinaryValue
QueryDWORDValue
QueryGUIDValue
QueryMultiStringValue
QueryQWORDValue
QueryStringValue
它們能更安全的返回資料,QueryValue已不建議使用。
7. warning C4996: 'CWinApp::Enable3dControlsStatic': CWinApp::Enable3dControlsStatic is no longer needed. You should remove this call.
CWinApp::Enable3dControls和CWinApp::Enable3dControlsStatic都不需要了。
8. warning C4706: assignment within conditional expression
當你寫出if (a = b) 或者 if (a = func()) 這樣的代碼時就會出現這樣的警告。有時候if (a = func())確實是你想要的,那麼改為if ((a = func()) != NULL)會消除警告。
9. 1>./VehmscX.def : warning LNK4222: exported symbol 'DllCanUnloadNow' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllGetClassObject' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllRegisterServer' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllUnregisterServer' should not be assigned an ordinal
控制項工程編譯出的警告,將.def檔案中相關函數的序數刪掉就可以了。
The following symbols should not be exported by ordinal:
- DllCanUnloadNow
- DllGetClassObject
- DllGetClassFactoryFromClassString
- DllInstall
- DllRegisterServer
- DllRegisterServerEx
- DllUnregisterServer
1. WINVER not defined. Defaulting to 0x0600 (Windows Vista)
如果沒有定義WINVER,預設的支援作業系統版本為Vista,可以在工程設定中增加WINVER=0x500;_WIN32_WINNT=0x500; 定義支援的作業系統版本為Win2000。
2. warning C4996: 'strcpy': This function or variable may be unsafe.
C4996的警告是針對C語言中不安全的字串函數提出的,可以在工程設定中增加宏_CRT_SECURE_NO_WARNINGS來取消這一類的警告。
3. warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa.
根據ISO C++標準,itoa應當為_itoa。在vs2010下,如果我們把itoa改為_itoa時,編譯器照樣會在進行警告,告訴我們應該使用_itoa_s來代替_itoa
可以想象,C++標準函數正在逐步向安全性轉變
類似的警告有:
warning C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strupr
warning C4996: 'strlwr': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strlwr
4. warning LNK4017: DESCRIPTION statement not supported for the target platform; ignored
VC9的連接器不再支援.def檔案中的DESCRIPTION。
5. warning C4244: '=' : conversion from '__time64_t' to 'long', possible loss of data
CTime::GetTime()返回的是__time64_t類型了。
VC9的MFC一些函數傳回型別都改成__int64了。
6. warning C4996: 'ATL::CRegKey::QueryValue': CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue
CRegKey有了很多新成員,針對不同的資料類型都有相應的方法:
QueryBinaryValue
QueryDWORDValue
QueryGUIDValue
QueryMultiStringValue
QueryQWORDValue
QueryStringValue
它們能更安全的返回資料,QueryValue已不建議使用。
7. warning C4996: 'CWinApp::Enable3dControlsStatic': CWinApp::Enable3dControlsStatic is no longer needed. You should remove this call.
CWinApp::Enable3dControls和CWinApp::Enable3dControlsStatic都不需要了。
8. warning C4706: assignment within conditional expression
當你寫出if (a = b) 或者 if (a = func()) 這樣的代碼時就會出現這樣的警告。有時候if (a = func())確實是你想要的,那麼改為if ((a = func()) != NULL)會消除警告。
9. 1>./VehmscX.def : warning LNK4222: exported symbol 'DllCanUnloadNow' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllGetClassObject' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllRegisterServer' should not be assigned an ordinal
1>./VehmscX.def : warning LNK4222: exported symbol 'DllUnregisterServer' should not be assigned an ordinal
控制項工程編譯出的警告,將.def檔案中相關函數的序數刪掉就可以了。
The following symbols should not be exported by ordinal:
- DllCanUnloadNow
- DllGetClassObject
- DllGetClassFactoryFromClassString
- DllInstall
- DllRegisterServer
- DllRegisterServerEx
- DllUnregisterServer