C编程:预处理器,包括宏的文件

如果我能找到一种方法来做类似的事情,我可以在我的应用程序中删除数百行代码,并大大提高可维护性。 有人有主意吗?

#include  int main( ) { #define include_all_files(root) \ #include #root "1.h" \ #include #root "2.h" \ #include #root "3.h" \ #include #root "4.h" include_all_files( first_library ) include_all_files( second_library ) include_all_files( third_library ) return 0; } 

编辑

我很欣赏这些回复,我的例子似乎导致了误导,所以这就是我实际上要解决的问题:

我正在实现一个有限状态机。 通过命名约定,我已经让它变得像添加状态一样简单:

  STATE(initial_screen) #include "initial_screen.state" END_STATE STATE(login) #include "login.state" END_STATE 

但是,如果我能回答原来的问题,我可以将其重构为简单的事情:

  ADD_STATE(initial_screen) ADD_STATE(login) 

这是因为文件名和状态名称以及所有底层连接和其他所有内容都遵循类似的约定。 但是,我无法弄清楚如何根据宏中收到的令牌实现包含文件。

不幸的是,这超出了C预处理器的能力。

您是否考虑过使用类似m4的东西?

为什么不创建一个头文件本身#include的所有其他头文件? 然后,对于每个库,您只需包含该库的一个元标题。

要解决您澄清的问题,您可以重构initial_screen.statelogin.state以便它们以STATE()开头并以END_STATE结束。 然后你可以这样做:

 #include "initial_screen.state" #include "login.state" 

…这相当于你所追求的 – 它只是一个#include而不是ADD_STATE

在文件includes.h中

 #include "1.h" #include "2.h" #include "3.h" 

在所有其他文件中

 #include "includes.h" 

#include预处理指令本身在与宏评估相同的步骤中处理,这可能不起作用。 我不相信预处理可以递归。 (或迭代,就此而言)。

相反, 这样做的典型方法是创建一个包含所有所需#includes的小包含文件。 请参阅Cory Petosky对插图的回应。

提醒一句
虽然这可能会削减数百行代码,但您应该考虑这些是“简单”的代码行 。 人们通常会略过它们,不像与程序的真实逻辑相关的代码行。

此外,明确列出给定文件所必需的个人包括提供一些自我文档,并使得在需要时更容易重构代码。

编辑 :这只是在;-)
有人刚问过这个问题好主意把所有项目标题放到一个文件中? 并且响应似乎与我的观点大致相同,即通过分组标题通常没什么好处。