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
需要两个参数。我知道它只是同名但不同的函数或宏,但是包含文件之间出现了冲突。编译器不知道它们属于不同的世界。
如何避免这种编译错误?
切换包含的顺序:
#ifdef USED_IN_QEMU
#include "includeB.h"
#endif
#include "includeA.h"
Run Code Online (Sandbox Code Playgroud)
这样 includeA.h 中的宏就不会影响 includeB.h 中的任何内容。