暂时覆盖C预处理器中的宏

时间:2013-01-10 15:37:41

标签: c c-preprocessor

我需要暂时覆盖一个宏然后恢复它。像:

#define FOO X
#save FOO
#define FOO Y
...
#restore FOO

是否可以在标准C预处理器中使用?在海湾合作委员会?

ADDED 即可。关于现实世界的例子。我使用全局宏来表示错误异常。它的作用类似于assert,但对于持久使用,不仅适用于调试版本;所以,例如,我通常在宏内调用函数(带副作用)。它定义了一次,但定义并不持久;因此,我不知道它是先验的。对于某些代码,我需要自己的宏修改版本,但我想保存一般代码风格。当代码的一部分使用一个宏时,它看起来很丑,其他部分使用其他宏 - 两个宏都具有相同的目的,但实现略有不同。

因此,暂时保存原始宏,对代码的一部分使用不同的版本,然后恢复原始宏是很好的。

3 个答案:

答案 0 :(得分:6)

如前所述,这是不可能的。根据具体情况,这可能是一种解决方法:

#include "generalmacrodefs.h" // put them in here or include them indirectly
#undef macro1
#define macro1 "specialized temporary value"
#undef macro1
#include "generalmacrodefs.h" // restores

这要求generalmacrodefs.h至少对您可能暂时覆盖的定义使用这样的模式:

#ifndef macro1
#define macro1 "original value"
#endif

答案 1 :(得分:5)

#pragma push_macro#pragma pop_macro可以做到这一点。这些不是标准C,它们最初是MSVC扩展,但是是clang supports themso does GCC

用法示例:

int main() {
#define SOME_MACRO 1
  printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma push_macro("SOME_MACRO")
#define SOME_MACRO 2
  printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma pop_macro("SOME_MACRO")
  printf("SOME_MACRO = %d\n", SOME_MACRO);
  return 0;
}

打印:

SOME_MACRO = 1
SOME_MACRO = 2
SOME_MACRO = 1

您还可以在#undef / push_macro对中pop_macro宏,然后pop_macro调用将重新定义它。

答案 2 :(得分:1)

最接近C的是#undef指令,它只是取消定义宏,允许它被替换:

#define FOO X

...

#undef FOO
#define FOO Y

...

#undef FOO
#define FOO X

问题是,重新定义后,您无法知道FOO的“旧”值 - 因此您的值必须在一个地方进行硬编码。

您也无法创建宏来保存值,因为不可能有一个宏在标准C中创建其他预处理器指令。