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

Cha*_*Kim 3 c c++ gcc compiler-errors c-preprocessor

我认为可能没有办法避免这种情况,只能更改函数/宏名称,但我在这里问以防万一。

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

我正在尝试(刚刚开始)修改程序 A(针对动态库),以便程序使用程序 B 中的函数(这与此问题无关,但程序 A 是基于multi2sim是我同事写的,程序B是qemu,著名的CPU/机器模拟器)。

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

#include "includeA.h"

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

// some code...
Run Code Online (Sandbox Code Playgroud)

includeA.h 有一个这样的宏:

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

但是includeB.h有这个代码:

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

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

如何避免这种编译错误?

dbu*_*ush 5

切换包含的顺序:

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

#include "includeA.h"
Run Code Online (Sandbox Code Playgroud)

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