【问题标题】:Conditional #include in CC中的条件#include
【发布时间】:2012-09-01 02:59:59
【问题描述】:

有没有办法使用 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 not found”。使用 Tools.h 中的 #define XML_EX,一切都可以正常构建。

【问题讨论】:

  • 你试过了吗?这正是许多系统标头的工作方式。
  • Check this 我认为这篇文章可能是您正在寻找的内容,或者至少是一个开始......
  • @Kerrek:是的。我希望它可以工作,但由于某种原因,我的 IDE 构建按钮无法工作,抱怨 Team 2 缺少 XML.h。
  • @Oliver:您必须弄清楚原因是什么,因为此处发布的代码没有任何问题。也许项目中的某个地方有另一个文件包含“Tools.h”而没有首先定义XML_EX,并且被 Team 2 使用——这是将定义放在项目设置而不是源文件中的一个很好的理由。
  • 好吧。看来我在构建过程中错过了一个非常重要的步骤。重新启动该死的 IDE。 -.- :D 感谢大家向我保证,我的第一个想法实际上是正确的并且有效。

标签: c include c-preprocessor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 让我们假装,A队是一群白痴,怎么只能在IDE中点击“RUN”按钮。
    • 完成。我通过项目文件强制输入 -D 宏。毕竟这是最好的解决方案,虽然没有人注意到“该文件中的有趣内容”,但没有人担心。
    【解决方案3】:

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

    作为示例,我也有 Tools.c 并且该源的编译失败(自然),因为我的项目中没有 XML.h。从项目中删除源代码并仅链接到预编译的工具可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2011-01-30
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多