在c中使用cmake和宏自动包含头文件?

时间:2017-10-22 06:34:23

标签: c cmake macros

我有一个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以进行所需的导入吗?

2 个答案:

答案 0 :(得分:2)

C预处理器本身并不是一种能够胜任这种事情的语言。你可能想要看的是代码生成,你有一些预构建步骤,用MOD( hello )行读取你的文件,并生成一个列出相应{的文件。 {1}}行。然后,将生成的文件包含在您需要的位置。

您可以用您想要的任何语言编写此预构建步骤,合理的选择可以是:#include <modules/hello.h>sedawk,C,Python,Ruby等。

答案 1 :(得分:0)

CMake提供命令generate_file。您使用它,用其值替换某个变量。如果您使用##_init (module* ${MODULE_NAME})并在名为MODULE_NAME的模块的循环中使用CMake变量,则可以找到解决方案。

我不确定这是不是一个好主意。为什么你不能使用某些configure header file