有没有办法用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队? (我知道简单的解决方案不起作用,更多的是说明所需的“工作流程”。)
边界条件是:
编辑: 对于建议的解决方案和提示,这是常见的方式,也许它与我的构建过程有关,但它不起作用。 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
可以很好地构建所有内容。
答案 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中删除源代码并只链接预编译的工具可以正常工作。