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

20 c c-preprocessor

我需要暂时覆盖一个宏,然后恢复它.喜欢:

#define FOO X
#save FOO
#define FOO Y
...
#restore FOO
Run Code Online (Sandbox Code Playgroud)

是否可以在标准C预处理器中使用?在GCC?

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

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

nor*_*gon 7

使用#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;
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

SOME_MACRO = 1
SOME_MACRO = 2
SOME_MACRO = 1
Run Code Online (Sandbox Code Playgroud)

您还可以#undefpush_macro/ pop_macro对中使用宏,该pop_macro调用将重新定义它。


Ber*_*ann 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
Run Code Online (Sandbox Code Playgroud)

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

#ifndef macro1
#define macro1 "original value"
#endif
Run Code Online (Sandbox Code Playgroud)

  • 在 gcc 和 Visual Studio 中,您都可以使用 #pragma push_macro 和 #pragma pop_macro。 (2认同)