我需要重新定义父项目中的预处理器定义吗

Do I need to redefine preprocessor defines in parent projects?

本文关键字:定义 项目 预处理 处理器 新定义      更新时间:2023-10-16

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

假设我有两个C++项目projAprojB。在projA中的exmpl.h文件中,存在以下条件:

class myClass
{
...
#ifdef MYVAR
virtual ~myClass() {}
#endif
}

我将MYVAR定义为一个项目设置,并编译projA以生成projA.a静态库。

现在,从projB,我需要使用projA的exmpl.h。简单地说,我包括它并使用projA.一个静态库编译projB。

然而,想象一下,在projB中,我没有定义MYVAR

  • 在这种情况下会发生什么?projB是否跳过了#ifdef中的代码,但使用了与#ifdef中的代码一起编译的静态库?

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

  • 我们必须定义所有在子项目中使用的预处理器定义吗?

谢谢。

两个项目中使用的myClass的定义必须相同,否则违反了"一个定义规则",导致未定义的行为,不需要诊断(也就是说,编译器不需要告诉您违规情况)。

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

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