有条件的#包括在C中

有条件的#包括在C中,c,include,c-preprocessor,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 "X

有没有办法用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"
第一队和第二队

#define XML_EX
#include "Tools.h"
第二队?(我知道简单的解决方案是行不通的,更多的是为了说明所需的“工作流程”。)

边界条件为:

  • Windows系统
  • CVI/lawide
  • 禁止制作文件
  • Tools.h应该在没有外部项目的情况下编译
编辑: 对于建议的解决方案和提示,这是常见的方法,可能与我的构建过程有关,但它不起作用。IDE抱怨团队2缺少XML.h。我想,这是因为IDE试图先独立编译每个源代码,而不知道“外部”定义

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

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

main.c

#define XML_EX
#include "Tools.h"

void main(void)
{
  test();
}
然后是工具

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

h具有测试函数,XMLEx.c实现了它。如果我尝试构建,我会得到一个“XML.h未找到”。通过工具中的
#define XML_EX
,一切都可以正常运行。h.

您建议的解决方案通常就是正在使用的解决方案,而且非常常见。也可以在makefile/project文件中传递宏


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

您可以有一个team.h文件,它为team a定义任何宏,而不为team B定义宏,或者定义不同的值,每个team都有自己的team.h副本


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

我愚弄了自己。如上所述,代码没有问题。我解释了IDE的错误消息


至于这个例子,我还使用了Tools.c,而该源代码的编译(自然)失败了,因为我的项目中没有XML.h。从projekt中删除源代码,只需链接预编译工具就可以了。

您尝试过吗?这正是许多系统头的工作方式。我想这篇文章可能是你想要的,或者至少是一个开始…@Kerrek:是的。我希望它能工作,但由于某种原因,我的IDE build按钮无法工作,抱怨团队2缺少XML.h。@奥利弗:你必须找出原因是什么,因为这里发布的代码没有问题。也许项目中还有另一个文件包含“Tools.h”,但没有首先定义
XML\u EX
,团队2使用了它——这是将定义放在项目设置中而不是源文件中的一个很好的理由。我似乎错过了构建过程中非常重要的一步。重新启动该死的IDE。--:D谢谢大家让我确信,我的第一个想法是正确的和有效的。让我们假设,团队A是一群白痴,怎么只能点击IDE中的“运行”按钮。完成。我通过项目文件强制输入a-D宏。毕竟,这是最好的解决方案,尽管没有人注意到“文件中的有趣事情”,但没有人需要担心。