#pragma 支援
開發人員可以使用 #pragma 指令將警告作為錯誤處理;還可以啟用或禁用警告,如下面的樣本所示:
#pragma warning (error: 6260)
#pragma warning (disable: 6011)
#pragma warning (enable: 6056)
使用VS2005,編譯提示"xxxxxx被聲明為否決的
這是MS新的C庫提供的帶有檢查的函數,有記憶體溢出檢測。可以防止一部分程式bug, 抵制緩衝區溢位攻擊(buffer overflow attack). 但是應該速度上有犧牲。 解決辦法
1.所以在你確信安全的情況下,可以用#pragma warning(disable: 4996)消除這個警告
2.建議使用_s的緩衝區安全的版本,而不是簡單的屏蔽警告。
#pragma warning (disable: 4996) // 太多警告看著厭煩無視之
關於#pragma warning
1.#pragma warning只對當前檔案有效(對於.h,對包含它的cpp也是有效),而不是是對整個工程的所有檔案有效。當該檔案編譯結束,設定也就失去作用。
2.#pragma warning(push) 儲存當前警示設定。
#pragma warning(push, n) 儲存當前警示設定,並設定警示層級為n。n為從1到4的自然數。
3.#pragma warning(pop)恢複之前壓入堆棧的警示設定。在一對push和pop之間作的任何警示相關設定都將失效。
4.#pragma warning(disable: n) 將某個警報置為失效
5.#pragma warning(default: n) 將警示置為預設
6.某些警告如C4309是從上到下生效的。即檔案內#pragma warning從上到下遍曆,依次生效。
例如:
void func()
{
#pragma warning(disable: 4189)
char s;
s = 128;
#pragma warning(default: 4189)
char c;
c = 128;
}
7.某些警告例如C4189是以函數中最後出現的#pragma warning設定為準的,其餘針對該警示的設定都是無效的。
例如:
void func()
{
#pragma warning(disable: 4189)
int x = 1;
#pragma warning(default: 4189)
}
則C4189仍然會出現,因為default指令是函數的最後一條。在該檔案內的其他函數中,如果沒有重新設定,C4189也是以#pragma warning(default: 4189)為準。如果重新設定,同樣是按照其函數中的最後一個#pragma warning為準。8.某些警告(MSDN認為是大於等於C4700的警告)是在函數結束後才會生效。
例如:
#pragma warning(disable:4700)
void Func()
{
int x;
int y = x;
#pragma warning(default:4700)
int z= x;
}
則y = x和z = x都不會產生C4700警示。只有在函數結束後的後的另外一個函數中,#pragma warning(default:4700)才會生效