24

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

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

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

添加。关于现实世界的例子。我使用全局宏来处理错误异常。它的作用类似于assert,但用于持久使用,不仅用于调试版本;因此,例如,我通常在宏内部调用函数(有副作用)。它被定义一次,但定义不是持久的;因此我不知道它是先验的。对于某些代码,我需要它自己的修改版本的宏,但我想保存一般的代码样式。当一部分代码使用一个宏,另一部分使用另一个宏时,这看起来很难看——两个宏的目的相同,但实现方式略有不同。

所以,我最好暂时保存原始宏,对部分代码使用不同的版本,然后恢复原始宏。

4

3 回答 3

12

这可以通过#pragma push_macro和实现#pragma pop_macro。这些不是标准的 C——它们最初是一个 MSVC 扩展——但clang 支持它们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_macropop_macropop_macro

于 2019-02-28T00:10:58.390 回答
9

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

#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
于 2013-01-10T19:08:19.477 回答
1

最接近 C 语言的是#undef指令,它简单地取消定义宏,允许它被替换:

#define FOO X

...

#undef FOO
#define FOO Y

...

#undef FOO
#define FOO X

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

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

于 2013-01-10T15:44:09.427 回答