如果之前未定义,则定义一个宏然后取消定义它

时间:2013-03-05 20:15:55

标签: c++ c-preprocessor

我包含了需要某些支持处理器#define的头文件,但是我不希望这会污染我的其余代码,例如:

// 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

我正在思考:

#ifdef FOO
#define FOO_DEFINED
#endif

#define FOO
#include "Bar.h"

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

问题:

  1. 上述工作是否会将所有宏定义(或缺少)恢复到事先所处的状态?

  2. 是否有更简单的解决方案?

  3. 如果在我#define时已经定义了FOO,这有关系吗?我应该添加另一个#ifndef来防止这种情况吗?

2 个答案:

答案 0 :(得分:1)

在你的例子中,Bar.h似乎只关心是否定义了FOO,而不关心绑定它的实际表达式。此外,如果其他人(我假设您的代码示例本身是在头文件中)定义了FOO并关心绑定到它的表达式,那么您不希望错误地使用空表达式重新定义FOO。如果是这样,您可能希望简化:

#ifndef FOO
#define FOO
#define UNDEF_FOO
#endif

#include "Bar.h"

#ifdef UNDEF_FOO
#undef FOO
#endif

答案 1 :(得分:1)

  1. 是的,它应该有用。
  2. 我记得#pragma push_macro / pop_macro(“macro_name”),但它可能仅适用于gcc和MS VC ++
  3. 是的,重要的是,如果再次使用不同的值定义,您将收到警告。如您所述,您可以使用#ifndef屏蔽它。