#define cimg_use_jpeg 2
#ifndef cimg_use_jpeg
//code goes here
#endif
我真的不明白......爲什麼ifndef/endif之間的代碼仍然可以在這裏運行?
#define cimg_use_jpeg 2
#ifndef cimg_use_jpeg
//code goes here
#endif
我真的不明白......爲什麼ifndef/endif之間的代碼仍然可以在這裏運行?
每次發生與此類似的事情(所謂不可能的事情)時,原因是:我在編輯器中看到的代碼不是運行的代碼。這可能發生在許多方面。
+1當我在調試時,我會'#if 0/*舊代碼*/#else/*新代碼* /#endif',這樣我就可以嘗試修復,但能夠輕鬆恢復到原始狀態。我有時會不小心在'/ *舊代碼* /'中進行更改,認爲我正在更改'/ *新代碼* /',然後在重新編譯時沒有任何更改。 – cape1232 2010-07-18 15:03:58
@ cape1232爲什麼不使用源代碼管理?源代碼控制的全部目的是讓你恢復,並且它通常比你的手動版本控制更易於管理... – atk 2010-07-18 16:21:51
@atk我這樣做,就像cape1232,我只是想改變幾分鐘。然後來電話... – 2010-07-18 16:35:01
要麼你寫
#define yoursymbol
#ifdef yoursymbol
,或者你寫
#define yoursymbol somevalue
#if yousymbol == somevalue
不要混合使用它們
編輯: 因爲人們似乎誤解了我的意思,這裏是一個澄清:當你編程時,編碼是非常重要的,這樣其他人就能理解你的意圖是什麼,所以如果你的意圖只是檢查一個符號是否被定義了,那麼指定一個數值是很困難的。
-1:關閉主題,不回答問題。他不希望代碼執行。 – alternative 2010-07-18 14:51:08
你可以混合它們。看到我的答案(因爲我不能把代碼放在評論中)。 – cape1232 2010-07-18 14:58:00
@mathepic只是顯示原則,而不是主題。其實混合風格並不好。要麼使用宏符號的值,要麼只是想知道符號本身是否已被定義,但是通過混合使讀者不清楚宏的意圖是什麼。 – 2010-07-19 01:38:58
這應該肯定會按照您的預期工作。假設cimg_use_jpeg
按照預期定義,#ifndef/#endif
塊中的代碼甚至不會被編譯器編譯。
所以問題是,cimg_use_jpeg
定義爲你所期望的?或者您是否簡化了您的問題,並且憑藉簡化提供了一個實際可行的樣本?
它無法執行。也許你運行不正確的可執行文件打印__DATE__
和__TIME__
來追蹤或記錄有助於檢測這些錯誤。
'__DATE__'和'__TIME__'將正確顯示,如果你用反引號將它們包圍。我爲你解決了這個問題。 – sepp2k 2010-07-18 14:50:17
@Anders K.這工作,即適當的東西沒有執行。代碼產生「BAZ is undefined」
#define FOO 2
#define BAR
int main(int argc, char* argv[])
{
#ifndef FOO
std::cout << "FOO is undefined" << std::endl;
#endif
#ifndef BAR
std::cout << "BAR is undefined" << std::endl;
#endif
#ifndef BAZ
std::cout << "BAZ is undefined" << std::endl;
#endif
}
只是因爲它的工作並不意味着你應該。如果你只是想看看符號是否被定義(這是我的意思是在我的文章中),那麼讀者就會很難理解'2'的意思。 – 2010-07-19 01:57:20
是的。我應該將2改爲1.這2是令人困惑的。 – cape1232 2010-07-20 01:26:10
請展示一個完整的c代碼,證明你認爲不正確,因爲代碼甚至不應該被編譯。嘗試使用'gcc -E'獲取預處理器輸出 – mvds 2010-07-18 14:37:51
如果在#define之後有#undef,它可以。你的確切代碼是什麼? – Gobra 2010-07-18 14:39:29
或#define周圍是否有#ifdef。或幾百個其他選項。但它不應該像現在這樣編譯。 – mvds 2010-07-18 15:27:35