我斷言宏是這樣的:這是否得到優化?
#ifdef DEBUG
#define ASSERT(x) ((void)(!(x) && assert_handler(#x, __FILE__, __LINE__) && (exit(-1), 1)))
#else
#define ASSERT(x) ((void)sizeof(x))
我想這是更多或防彈少,但我似乎可以用它很多聲稱的這是重要的,它們的副作用函數的返回值的情況下。如果我的發佈版本中我最終編譯
ASSERT(fgets(buffer,sizeof(buffer)/sizeof(buffer[0]),file));
這將成爲
((void)sizeof(fgets(buffer,sizeof(buffer)/sizeof(buffer[0]),file)));
是否有這將讓完全優化掉的機會嗎?我相當肯定它不會(我正在調用一個函數,fgets
),但確保它的條件究竟是什麼?有沒有優化器可能拋出的副作用?
通常,你寫斷言,以便他們沒有任何副作用,因此可以remoevd。在自己的行上執行'fgets',保存結果,然後使用'assert(result!= NULL)'。然後定義非調試'assert'來放棄'x'。或者當我們處於這種狀態時,stdlib中沒有'assert'嗎? – delnan
好的,所以斷言根本不意味着與副作用一起使用。我現在感到很傻。有我自己的斷言很好,因爲它在調試器中很容易跟蹤,而不是從某個CRT彈出,我可以控制它的行爲(特定於應用程序的alert?stderr?passive?abort program?) –
「聲稱帶有side效果「有時稱爲」驗證「,所以你可以這樣命名你的宏。 「assert」通常被理解爲不需要作爲程序邏輯的一部分。 –