C++常見警告

來源:互聯網
上載者:User

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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.