我正在编写一个C程序,其中包含很多功能,某些功能只有某些人才需要在某些计算机上使用。其中一些功能需要安装某些库,而没有安装这些库,则程序将无法编译。
我想要的是能够打开和关闭某些特定功能,以便无需某些位所需的额外库就可以进行编译。
我想知道在C语言中是否有达成共识的方法,以及您将如何进行?
我的想法是,我将使用#define INCLUDE_BOOT_FUNCTIONALITY
,然后在BootFunctionality.c
内使用顶部的#ifdef INCLUDE_BOOT_FUNCTIONALITY
,仅在编译之前将其中的代码包括在内。定义。然后,我还将遍历使用BootFunctionality.c
的每一段代码,并将其包装在#ifdef预处理程序命令中。
这是一种可接受的做事方式,还是有更好的方式?
对于上下文,我的代码以模块化的形式编写,其中每个模块(例如BootFunctionality.c
)都在其自己的线程中运行,并且仅在程序开始时启动并调用{{1 }。要删除它,我要做的就是删除Main.c
中包含它的位置并删除Main.h
中启动该线程的行。
答案 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或任何其他构建脚本中。