【问题标题】:Auto include header files using cmake and macros in c?在c中使用cmake和宏自动包含头文件?
【发布时间】:2018-04-02 22:17:31
【问题描述】:

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

【问题讨论】:

  • So can i somehow list all folders in CMake inside modules - file(GLOB) 应该可以帮助您完成这项任务。 and pass them to configure_file to make the needed imports? - 在找到的文件夹上使用for 循环,您可以使用#include&lt;&gt; 指令列表填充变量。然后你可以在configure_file中使用这个变量。

标签: c cmake macros


【解决方案1】:

C 预处理器本身并不是一种足够强大的语言来做这种事情。您可能想要查看的是代码生成,其中您有某种预构建步骤,它使用MOD( hello ) 行读取您的文件,并生成一个列出相应#include &lt;modules/hello.h&gt; 的文件线。然后,将生成的文件包含在您需要的地方。

您可以使用任何您想要的语言编写此预构建步骤,合理的选择可能是:sedawkperl、C、Python、Ruby 等。

【讨论】:

  • 好的,所以我使用 cmake 作为我的构建工具,MOD 是一个简单的宏函数,它获取模块的 init 方法的引用指针。您是否建议在我的 cmake 构建文件中进行更改?
  • @georoot:是的,您可以使用 cmake 进行设置。恐怕我对 cmake 不够熟悉,无法确切建议您如何做到这一点。
  • 非常感谢您花时间为我指明正确的方向。现在我很清楚我需要去哪一边。让我编辑问题并添加带有修改的 cmake 标记 :)
  • “C 预处理器本身并不是一种足够强大的语言来做这种事情。” Are you sure?
  • @HWalters:那是使用文字。这不是从 mod_list 初始化程序中读取并动态生成 #include 指令。关键是,OP 只想列出模块一次。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多