C语言中的条件#include指令

6

有没有一种方法可以使用c预处理器进行条件包含?

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

有没有一种机制可以实现类似以下内容:

#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif

只需要在更高的(项目)级别上使用#define XML_EX吗?例如

#include "Tools.h"

针对团队1和

#define XML_EX
#include "Tools.h"

针对第二个团队?(我知道简单的解决方案不起作用,更多是为了说明所需的“工作流程”。)

边界条件是:

  • Windows系统
  • CVI / LawWindows IDE
  • 没有make文件
  • Tools.h应该可以在没有外部项目的情况下编译。

编辑:对于建议的解决方案和提示,这可能与我的构建过程有关,但它不起作用。IDE抱怨找不到团队2的XML.h。我猜这是因为IDE首先尝试编译每个源码,而不知道“外部”#define。

编辑:假设A团队是一群只会按IDE中的“运行”按钮的白痴。因此,最好能够开箱即用。

编辑:好吧,这让我感到困惑。我学到的所有东西都告诉我,它应该起作用。这是我测试过的一个最小设置:

main.c

#define XML_EX
#include "Tools.h"

void main(void)
{
  test();
}

然后是 Tools.h。
#ifdef XML_EX
  #include "XMLEx.h"
#else
  #include "XML.h"
#endif

XMLEx.h文件有测试函数,XMLEx.c文件实现了该函数。但是如果我尝试构建它,会出现“XML.h未找到”的错误。在Tools.h中加入#define XML_EX后就可以顺利构建了。

2
你试过了吗?这正是许多系统头文件的工作方式。 - Kerrek SB
1
请查看此链接:http://www.java-samples.com/showtutorial.php?tutorialid=532。我认为这篇文章可能是你正在寻找的,或者至少是一个起点... - Angelos Chalaris
@Kerrek:是的。我本来以为它会工作,但由于我的IDE构建按钮无法正常工作,因为Team 2缺少XML.h文件,所以出了问题。 - Oliver
@Oliver:你需要找出原因,因为这里发布的代码没有问题。也许项目中还有另一个文件包含了“Tools.h”,但是没有首先定义XML_EX,并且被Team 2使用——这是将定义放在项目设置中而不是源文件中的好理由。 - Steve Jessop
好的,看来我在构建过程中错过了一个非常重要的步骤。重新启动该死的IDE。-.- :D 感谢大家确保我的第一个想法实际上是正确的并且有效。 - Oliver
3个回答

3
您建议的解决方案通常是被使用的,经常这样做。您也可以在makefile /项目文件中传递宏。
另外请注意,Tools.h是一个头文件,将始终作为另一个文件的一部分进行编译。

0

你可以有一个team.h文件,定义Team A的任何宏,而不为Team B定义它们,或者定义不同的值,每个团队都有自己的team.h副本。

每个团队成员还可以通过-D选项将该值传递给编译器作为宏(至少Linux编译器支持此功能)。如果您这样做,我建议您传递TEAM_A或TEAM_B,以便在未来更灵活,并且不必传递更多的宏。


假设A团队是一群只会在IDE中点击“运行”按钮的白痴。 - Oliver
完成。我通过项目文件强制加入了一个-D宏。毕竟这是最好的解决方案,而且当没有人注意到那个文件中的“有趣的事情”时,也没有人需要担心。 - Oliver

0

我自己给自己上了当。如上所述,代码没有问题。我误解了我的IDE的错误信息。

继续用例子来说,我还有一个名为Tools.c的文件,编译这个源码失败了(当然),因为我的项目中没有XML.h。将该源码从项目中移除,只链接到预编译的Tools就可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接