C中的条件#include

时间:2012-09-07 08:32:41

标签: 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

只有更高(项目)级别的#define XML_EX?像

#include "Tools.h"
第1组的

#define XML_EX
#include "Tools.h"

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

边界条件是:

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

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

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

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

的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可以很好地构建所有内容。

3 个答案:

答案 0 :(得分:3)

您建议的解决方案通常是使用的解决方案,并且经常使用。您还可以在makefile / project文件中传递宏。

另请注意,Tools.h是一个头文件,并且将始终作为另一个文件的一部分进行编译。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我欺骗了自己。如上所述,代码没有任何问题。我想念我的IDE的错误消息。

至于保留这个例子,我还有Tools.c,并且该源的编译失败(自然),因为我的项目中没有XML.h。从projekt中删除源代码并只链接预编译的工具可以正常工作。