C中的条件#include

Oli*_*ver 5 c include c-preprocessor

有没有办法用 c 预处理器进行条件包含?

我有一个由不同团队共享的工具“库”(Tools.c、Tools.h)。该库依赖于提供 XML 功能的第二个库。让我们称之为 XML.h 现在一个团队使用第二个库 (XML.h) 的普通版本,而另一个团队在他们的项目中使用扩展版本 (XMLEx.h)。第二个团队不想包含 XML.h,因为他们已经包含 XMLEx.h,提供 XML.h 的所有功能。

是否有一种机制来实现类似的东西:

#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif
Run Code Online (Sandbox Code Playgroud)

只有#define XML_EX在更高(项目)级别?喜欢

#include "Tools.h"
Run Code Online (Sandbox Code Playgroud)

对于第 1 队和

#define XML_EX
#include "Tools.h"
Run Code Online (Sandbox Code Playgroud)

对于第 2 队?(我知道简单的解决方案行不通,更多的是为了说明所需的“工作流程”。)

边界条件是:

  • 视窗系统
  • CVI/法律Windows IDE
  • 没有制作文件
  • Tools.h 应该在没有外部项目的情况下编译。

编辑:对于建议的解决方案和提示,这是常见的方式,也许它与我的构建过程有关,但它不起作用。IDE 抱怨团队 2 缺少 XML.h。我想,这是因为 IDE 尝试首先独立编译每个源代码,而不知道“外部”#define。

编辑:让我们假设,A 团队是一群白痴,怎么只能点击 IDE 中的“运行”按钮。因此,它最好开箱即用。

编辑:好的,这让我感到困惑。我所学到的一切都告诉我,它应该有效。这是一个最小的集合,我已经测试过:

主文件

#define XML_EX
#include "Tools.h"

void main(void)
{
  test();
}
Run Code Online (Sandbox Code Playgroud)

然后Tools.h

#ifdef XML_EX
  #include "XMLEx.h"
#else
  #include "XML.h"
#endif
Run Code Online (Sandbox Code Playgroud)

XMLEx.h 具有测试功能,而 XMLEx.c 实现了它。如果我尝试构建,我会收到“未找到 XML.h”。使用#define XML_EXTools.h 中的a 一切都很好。

Sco*_*ter 0

您可以有一个 team.h 文件,该文件为团队 A 定义任何宏,但不为团队 B 定义宏,或者定义不同的值,并且每个团队都有自己的 team.h 副本。

每个团队成员还可以通过 -D 选项宏将该值传递给编译器(至少 Linux 编译器支持这一点)。如果您这样做,我建议您传递 TEAM_A 或 TEAM_B,以便将来为您提供更大的灵活性,而不必传递更多宏。