避免重新定义预处理器变量

Mar*_*ese 5 c++ variables redefine c-preprocessor

我有各种预处理器变量,它们在不同的库中具有相同的名称.

为了避免冲突,我正在做的是(在示例中,为简单起见,只有1个冲突的变量和1个标头):

#ifdef VAR
#define TEMPVAR VAR
#undef VAR
#endif   

#include "conflictingheader.hh" 

#ifdef VAR
#undef VAR
#endif

#ifdef TEMPVAR
#define VAR TEMPVAR
#undef TEMPVAR
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一种自动方式来存储所有冲突的变量,取消定义它们并在以后恢复它们?

或者是否可以定义宏来执行这些操作?

jxh*_*jxh 8

C++语言不提供处理预处理器宏保存和恢复的自动方法.预处理器宏(未在编译器或编译器命令行中定义)在文件全局级别上工作,并且没有将宏的范围限制为#included 的特定头的概念.

我处理这样一个问题的方法是创建一个新的头文件,它为我需要的特定库提供的功能提供接口包装,但没有任何宏依赖.然后在仅包含该麻烦的头文件的源文件中实现包装器.


您的编译器可能会提供一个扩展,使任务不那么冗长,但不是以我理解您的方式完全自动化.

GCC和Microsoft编译器支持推送和弹出宏编译指示.

为了与Microsoft Windows编译器兼容,GCC支持#pragma push_macro("macro_name")#pragma pop_macro("macro_name").

#pragma push_macro("macro_name")
此pragma保存名macro_name为此宏的堆栈顶部的宏的值.

#pragma pop_macro("macro_name")
此pragma将此宏macro_name的值设置为此宏的堆栈顶部的值.如果堆栈为macro_name空,则宏的值保持不变.

GCC文档

  • 头文件不应包含源文件. (3认同)