2013-03-05 84 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来屏蔽它。