2010-07-18 53 views
0
#define cimg_use_jpeg 2 

#ifndef cimg_use_jpeg 

//code goes here 

#endif 

我真的不明白......爲什麼ifndef/endif之間的代碼仍然可以在這裏運行?

+2

請展示一個完整的c代碼,證明你認爲不正確,因爲代碼甚至不應該被編譯。嘗試使用'gcc -E'獲取預處理器輸出 – mvds 2010-07-18 14:37:51

+0

如果在#define之後有#undef,它可以。你的確切代碼是什麼? – Gobra 2010-07-18 14:39:29

+0

或#define周圍是否有#ifdef。或幾百個其他選項。但它不應該像現在這樣編譯。 – mvds 2010-07-18 15:27:35

回答

6

每次發生與此類似的事情(所謂不可能的事情)時,原因是:我在編輯器中看到的代碼不是運行的代碼。這可能發生在許多方面。

  • 忘記讓
  • 忘記保存
  • 保存代碼
  • 從你編譯
  • 新代碼跑了一個不同的環境現狀運行的副本,但我打開,我看着舊的輸出
+0

+1當我在調試時,我會'#if 0/*舊代碼*/#else/*新代碼* /#endif',這樣我就可以嘗試修復,但能夠輕鬆恢復到原始狀態。我有時會不小心在'/ *舊代碼* /'中進行更改,認爲我正在更改'/ *新代碼* /',然後在重新編譯時沒有任何更改。 – cape1232 2010-07-18 15:03:58

+1

@ cape1232爲什麼不使用源代碼管理?源代碼控制的全部目的是讓你恢復,並且它通常比你的手動版本控制更易於管理... – atk 2010-07-18 16:21:51

+0

@atk我這樣做,就像cape1232,我只是想改變幾分鐘。然後來電話... – 2010-07-18 16:35:01

0

要麼你寫

#define yoursymbol 

#ifdef yoursymbol 

,或者你寫

#define yoursymbol somevalue 

#if yousymbol == somevalue 

不要混合使用它們

編輯: 因爲人們似乎誤解了我的意思,這裏是一個澄清:當你編程時,編碼是非常重要的,這樣其他人就能理解你的意圖是什麼,所以如果你的意圖只是檢查一個符號是否被定義了,那麼指定一個數值是很困難的。

+1

-1:關閉主題,不回答問題。他不希望代碼執行。 – alternative 2010-07-18 14:51:08

+0

你可以混合它們。看到我的答案(因爲我不能把代碼放在評論中)。 – cape1232 2010-07-18 14:58:00

+0

@mathepic只是顯示原則,而不是主題。其實混合風格並不好。要麼使用宏符號的值,要麼只是想知道符號本身是否已被定義,但是通過混合使讀者不清楚宏的意圖是什麼。 – 2010-07-19 01:38:58

0

這應該肯定會按照您的預期工作。假設cimg_use_jpeg按照預期定義,#ifndef/#endif塊中的代碼甚至不會被編譯器編譯。

所以問題是,cimg_use_jpeg定義爲你所期望的?或者您是否簡化了您的問題,並且憑藉簡化提供了一個實際可行的樣本?

1

它無法執行。也許你運行不正確的可執行文件打印__DATE____TIME__來追蹤或記錄有助於檢測這些錯誤。

+0

'__DATE__'和'__TIME__'將正確顯示,如果你用反引號將它們包圍。我爲你解決了這個問題。 – sepp2k 2010-07-18 14:50:17

0

@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 
} 
+0

只是因爲它的工作並不意味着你應該。如果你只是想看看符號是否被定義(這是我的意思是在我的文章中),那麼讀者就會很難理解'2'的意思。 – 2010-07-19 01:57:20

+0

是的。我應該將2改爲1.這2是令人困惑的。 – cape1232 2010-07-20 01:26:10

相關問題