我是否需要在父项目中重新定义预处理器定义?

时间:2016-06-01 19:24:15

标签: c++ compilation

也许因为我找不到合适的关键字,我无法澄清我对谷歌的疑问。

假设我有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中的代码编译的?

  • 那么,这是一个错误并会导致意外行为吗?

  • 我们是否必须定义子项目中使用的所有预处理器定义,以及所有使用它们的项目?

感谢。

1 个答案:

答案 0 :(得分:2)

两个项目中使用的myClass的定义必须相同,否则它违反One Definition Rule,导致未定义的行为,无需诊断(即编译器不是&#39} ; t要求告诉你违规行为)。

所以,是的,您必须在projB中定义MYVAR,以及影响两个项目中使用的定义的其他定义。

当然,这仅适用于两个项目中使用的实体ODR。