我有一个C程序,里面有很多包含,有很多宏用于自动生成模块和构建过程的函数,例如
#define MODULE_DEFINE(M) void M##_init (module* module) {\
module->name = #M;
#define MODULE_END };
MODULE_DEFINE (hello)
printf("module name is : %s\n",module->name);
MODULE_END
现在,一旦模块被编译和链接,我需要将它们全部包含在一个公共头文件中。一种方法是手动包括所有这些,但我想知道是否有更好的方法来解决它?我已经按照如下所示的数组传递它们了。
module mod_list[] = {
MOD( hello )
};
使用的MOD
是另一个宏。现在相关部分是,所有模块都遵循include as
#include <modules/hello.h>
如上例所示。我可以以某种方式迭代或创建列表以从列表中自动包含?我不介意从数组更改为其他内容,因为我知道数组是在运行时定义的,而宏不能实际迭代它。如果迭代是可能的,我可以定义一个公共列表,使所有包含和定义数组,从而使过程自动化一点。谢谢你的帮助。
正如所指出的那样,只有宏才能完全实现。现在我使用CMake
作为我的构建工具。所有模块都以
modules
└── hello
├── hello.c
└── hello.h
我可以以某种方式列出模块内CMake
内的所有文件夹,并将它们传递给configure_file
以进行所需的导入吗?
答案 0 :(得分:2)
C预处理器本身并不是一种能够胜任这种事情的语言。你可能想要看的是代码生成,你有一些预构建步骤,用MOD( hello )
行读取你的文件,并生成一个列出相应{的文件。 {1}}行。然后,将生成的文件包含在您需要的位置。
您可以用您想要的任何语言编写此预构建步骤,合理的选择可以是:#include <modules/hello.h>
,sed
,awk
,C,Python,Ruby等。
答案 1 :(得分:0)
CMake提供命令generate_file
。您使用它,用其值替换某个变量。如果您使用##_init (module* ${MODULE_NAME})
并在名为MODULE_NAME的模块的循环中使用CMake变量,则可以找到解决方案。
我不确定这是不是一个好主意。为什么你不能使用某些configure header file?