也许因为我找不到合适的关键字,我无法澄清我对谷歌的疑问。
假设我有2个C ++项目; projA 和 projB 。 在projA中的 exmpl.h 文件中,存在以下情况:
class myClass
{
...
#ifdef MYVAR
virtual ~myClass() {}
#endif
}
我将MYVAR
定义为项目设置并编译projA以生成 projA.a 静态库。
现在,从projB开始,我需要使用projA的exmpl.h
。我只需将它包含在内并使用projA.a静态库编译projB。
但是,想象一下,在projB中我做了没有定义 MYVAR
。
在这种情况下会发生什么? projB是否跳过#ifdef
中的代码,但使用的静态库是使用#ifdef
中的代码编译的?
那么,这是一个错误并会导致意外行为吗?
我们是否必须定义子项目中使用的所有预处理器定义,以及所有使用它们的项目?
感谢。
答案 0 :(得分:2)
两个项目中使用的myClass
的定义必须相同,否则它违反One Definition Rule,导致未定义的行为,无需诊断(即编译器不是&#39} ; t要求告诉你违规行为)。
所以,是的,您必须在projB中定义MYVAR
,以及影响两个项目中使用的定义的其他定义。
当然,这仅适用于两个项目中使用的实体ODR。