在 C 或 C++ 中,如何防止头文件中的前一个 #define 影响后来包含的另一个头文件?

in C or C++, how can I prevent previous #define in a header file from affecting another header file later included?

我认为除了更改 function/macro 名称可能没有办法避免这种情况,但我在这里问以防万一。

我遇到了一个奇怪的情况。

我正在尝试(刚开始)修改程序A(针对动态库),使程序使用程序B中的函数(这与本题无关,但程序A是一个模拟器一个同事写的基于multi2sim的加速器,程序B是qemu,大名鼎鼎的CPU/machine模拟器)。

程序 A 中的文件 driverA.cc 如下所示:

#include "includeA.h"

#ifdef USED_IN_QEMU
#include "includeB.h"
#endif

// some code...

includeA.h 有这样一个宏:

#define set_pc(x) \
  do { p->check_pc_alignment(x); \
       npc = sext_xlen(x); \
     } while(0)

但是includeB.h有这个代码:

static inline void cpu_set_pc(CPUState *cpu, vaddr addr)
{
    CPUClass *cc = CPU_GET_CLASS(cpu);
                 
    cc->set_pc(cpu, addr);
} 

编译器抱怨 set_pc() 根据 includeA.h 应该只接受一个参数,但是 includeB.h 中的 set_pc() 接受两个参数。我知道它只是名称相同但功能或宏不同,但是包含文件之间出现了冲突。编译器不知道它们属于不同的世界。

如何避免这种编译错误?

切换包含的顺序:

#ifdef USED_IN_QEMU
#include "includeB.h"
#endif

#include "includeA.h"

这样 includeA.h 中的宏不会影响 includeB.h 中的任何内容。