如何为不同的目的/体系结构包括/删除C代码功能?

时间:2019-04-03 10:34:44

标签: c gcc c-preprocessor preprocessor-directive

我正在编写一个C程序,其中包含很多功能,某些功能只有某些人才需要在某些计算机上使用。其中一些功能需要安装某些库,而没有安装这些库,则程序将无法编译。

我想要的是能够打开和关闭某些特定功能,以便无需某些位所需的额外库就可以进行编译。

我想知道在C语言中是否有达成共识的方法,以及您将如何进行?

我的想法是,我将使用#define INCLUDE_BOOT_FUNCTIONALITY,然后在BootFunctionality.c内使用顶部的#ifdef INCLUDE_BOOT_FUNCTIONALITY,仅在编译之前将其中的代码包括在内。定义。然后,我还将遍历使用BootFunctionality.c的每一段代码,并将其包装在#ifdef预处理程序命令中。

这是一种可接受的做事方式,还是有更好的方式?

对于上下文,我的代码以模块化的形式编写,其中每个模块(例如BootFunctionality.c)都在其自己的线程中运行,并且仅在程序开始时启动并调用{{1 }。要删除它,我要做的就是删除Main.c中包含它的位置并删除Main.h中启动该线程的行。

2 个答案:

答案 0 :(得分:3)

您的脑海中似乎有很好的结构。确实,在编译时使用#ifdef来有条件地删除代码是相当普遍的做法。只要确保它们足够健壮,并且没有常量的组合会产生无法使用的可执行文件即可。

请记住,编译器对您有很大帮助,为您定义了一堆常量,以便您可以使用它们。 This是查找已定义内容的方法。 here是文档。此外,每个库可能会引入一些自己的常量。随时使用它们。

该想法是使过程尽可能自动化。使用库定义的常量来检查它们是否已加载,使用编译器定义的常量来获取有关环境的信息,等等。

此外,太多的预处理程序检查可能导致代码混乱。考虑在有意义的地方分离不同条件的代码。

最后,考虑一个构建系统,该系统将使用户可以轻松地选择他想要的选项并确保其被正确记录。

答案 1 :(得分:2)

采取相反的方式:如果platform1_header.h包含平台有问题的功能,则在源文件中应该有:

#if defined PLATFORM1
#include "platform1_header.h"
#elif defined PLATFORM2
#include "platform2_header.h"
#endif

并将适当的源代码添加到Makefile或任何其他构建脚本中。