在 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 中的任何内容。
我认为除了更改 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 中的任何内容。