簡體   English   中英

在C中使用cmake和宏自動包含頭文件?

[英]Auto include header files using cmake and macros in c?

我有一個包含很多包含內容的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作為

#include <modules/hello.h>

如上例所示。 我可以以某種方式遍歷或創建要從列表中自動包含的列表嗎? 我不介意從數組更改為其他數組,因為我知道數組是在運行時定義的,宏實際上不可能對此進行迭代。 如果有可能進行迭代,我可以定義一個公共列表以包含所有元素並定義數組,從而稍微自動化該過程。 謝謝你的幫助。

編輯

如所指出的,這並非僅使用宏是完全可能的。 現在,我使用CMake作為構建工具。 所有模塊均以以下格式放置在單獨的目錄中

modules
└── hello
    ├── hello.c
    └── hello.h

所以我能以某種方式列出模塊內部CMake中的所有文件夾,並將它們傳遞給configure_file進行所需的導入嗎?

C預處理程序本身並不是一種足夠強大的語言來執行此類操作。 您可能要看的是代碼生成 ,您需要執行某種預構建步驟,該步驟使用MOD( hello )行讀取文件,並生成一個列出相應的#include <modules/hello.h>線。 然后,將生成的文件包括在需要的位置。

您可以使用任何所需的語言編寫此預構建步驟,合理的選擇可能是: sedawkperl ,C,Python,Ruby等。

CMake提供命令generate_file 您使用它,用其值替換某些變量。 如果您使用##_init (module* ${MODULE_NAME})並在名為MODULE_NAME的模塊上的循環中包含CMake變量,則可以找到解決方案。

我不確定這是否是個好主意。 為什么不能使用一些配置頭文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM