繁体   English   中英

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

[英]C Programming: Preprocessor, include files from macro

如果我可以找到一种类似的方法,那么我可以在应用程序中减少数百行代码,并大大提高可维护性。 有人有想法么?

#include <stdio.h>

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)

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

为什么不创建一个头文件本身#include一切都会库中的其他头文件的? 然后,对于每个库,您只需添加该库的一个元标题即可。

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

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

为了解决您所澄清的问题,您只需重构initial_screen.statelogin.state使它们以STATE()开头并以END_STATE结束。 然后,您可以执行以下操作:

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

...相当于您所需要的-它只是#include而不是ADD_STATE

在文件include.h中

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

在所有其他文件中

#include "includes.h"

#include预处理指令本身在与宏评估相同的步骤中处理,因此可能无法正常工作。 我不认为预处理可以是递归的。 (或对此进行迭代)。

取而代之的是,完成此操作的典型方法是创建一个包含所有所需的#includes的小型包含文件。 请参阅Cory Petosky的回复以获取插图。

请注意
尽管这可能会减少数百行代码,但是您应该考虑这些是“简单”的代码行 与程序的真实逻辑相关联的代码行不同,通常会跳过它们。

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

编辑 :这只是在;-)
有人刚刚问了这个问题,将所有项目标头放入一个文件中是个好主意吗? ,而且回应似乎大致上与我的看法一致,即分组标头通常没有什么好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM