2013-03-05 75 views
0

我包括這需要一定的親處理器#define s到存在的頭文件,但是我不希望這種污染我的代碼如其他地區:定義一個宏,則取消定義它,如果它以前未定義

#ifdef FOO 
#define FOO_DEFINED 
#endif 

#define FOO 
#include "Bar.h" 

#ifndef FOO_DEFINED 
#undef FOO 
#else 
#undef FOO_DEFINED 
#endif 

問題:

// FOO may or may not already be defined here 
#define FOO 
#include "Bar.h" 
#undef FOO 
// FOO should be defined or not, as per the starting state 

我的線沿線的思維

  1. 上述工作是否將所有宏定義(或缺少)恢復到它們之前的狀態?

  2. 有沒有更簡單的解決方案?

  3. FOO是否已經被定義爲I #define呢?我應該增加另一個#ifndef來防止這種情況發生嗎?

+0

可能重複的[我可以重新定義一個C++宏,然後定義它?](http://stackoverflow.com/questions/1793800/can-i-redefine-ac-macro-then-define-it-返回) – Roddy 2013-03-05 20:22:48

+0

@Roddy在這個問題上做的解決方案工作,如果宏最初是未定義的? – 2013-03-05 20:44:33

+0

@MarkRansom:好的,對於gcc(也可能是msvc),接受的是:如果你推入並彈出一個未定義的宏,宏就會回到未定義狀態。正如預期的那樣,http://ideone.com/s2iVk8無法編譯。 – Roddy 2013-03-05 21:50:37

回答

1

看來在你的例子中,Bar.h只關心FOO是否被定義,而不是綁定到它的實際表達式。此外,如果其他人(我認爲你的代碼示例本身是在頭文件中)定義了FOO並且關心綁定到它的表達式,那麼你不想犯一個用空表達式重新定義FOO的錯誤。如果是的話,你可能要簡化:

#ifndef FOO 
#define FOO 
#define UNDEF_FOO 
#endif 

#include "Bar.h" 

#ifdef UNDEF_FOO 
#undef FOO 
#endif 
+0

謝謝,這比我的更漂亮,並解決了您指出的其他問題。 – JBentley 2013-03-05 20:28:23

1
  1. 是它應該工作。
  2. 我有#pragma push_macro/pop_macro(「宏名稱」)記住,但它可能只適用於gcc和MS VC++
  3. 是的,它很重要,如果再定義一個不同的值。正如你所述,你可以用#ifndef來屏蔽它。