0

我包括需要某些 pro-processor#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. 我是否已经定义了 FOO 是否重要#define?我应该添加另一个#ifndef来防止这种情况吗?

4

2 回答 2

1

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

#ifndef FOO
#define FOO
#define UNDEF_FOO
#endif

#include "Bar.h"

#ifdef UNDEF_FOO
#undef FOO
#endif
于 2013-03-05T20:23:24.573 回答
1
  1. 是的,它应该工作。
  2. 我有 #pragma push_macro/pop_macro("macro_name") 的想法,但它可能只适用于 gcc 和 MS VC++
  3. 是的,这很重要,如果再次使用不同的值定义它,您会收到警告。正如您所说,您可以使用#ifndef 屏蔽它。
于 2013-03-05T20:24:29.660 回答