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

C编程:预处理器,包含来自宏的文件,c,macros,include,c-preprocessor,C,Macros,Include,C Preprocessor,如果我能找到一种类似的方法,我可以在我的应用程序中删去数百行代码,并显著提高可维护性。有人有什么想法吗 #include <stdio.h> int main( ) { #define include_all_files(root) \ #include #root "1.h" \ #include #root "2.h" \ #include #root "3.h" \

如果我能找到一种类似的方法,我可以在我的应用程序中删去数百行代码,并显著提高可维护性。有人有什么想法吗

#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;
}
但是,如果我能回答最初的问题,我可以将其重构为以下简单的内容:

  ADD_STATE(initial_screen)
  ADD_STATE(login)

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

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

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

在文件includes.h中

#include "1.h"
#include "2.h"
#include "3.h"
在所有其他文件中

#include "includes.h"
文件中包含.h

#include "1.h"
#include "2.h"
#include "3.h"
在所有其他文件中

#include "includes.h"

include pre-process指令本身在与宏评估相同的步骤中处理,这可能不起作用。我不相信预处理是递归的。或者说是迭代的

相反,完成此操作的典型方法是创建一个小的include文件,其中包含所有所需的include。请参见科里·佩托斯基的回复以获取说明

请注意: 虽然这可能会减少数百行代码,但您应该认为这些代码行很简单。与程序的真正逻辑相关联的代码行不同,人们通常会略过它们

此外,显式列出给定文件所需的单个include可以提供一些自我文档,并且在需要时可以更容易地重构代码

编辑:这只是在-
有人刚刚问了这个问题,回答似乎与我的看法基本一致,即分组标题通常不会带来什么好处。

将include pre-process指令本身与宏评估放在同一个步骤中处理,这可能不起作用。我不相信预处理是递归的。或者说是迭代的

相反,完成此操作的典型方法是创建一个小的include文件,其中包含所有所需的include。请参见科里·佩托斯基的回复以获取说明

请注意: 虽然这可能会减少数百行代码,但您应该认为这些代码行很简单。与程序的真正逻辑相关联的代码行不同,人们通常会略过它们

此外,显式列出给定文件所需的单个include可以提供一些自我文档,并且在需要时可以更容易地重构代码

编辑:这只是在-
有人刚刚问了这个问题,回答似乎与我的看法基本一致,即分组标题通常不会带来什么好处。

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


您考虑过使用类似的工具吗?

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


您考虑过使用类似的方法吗?

为了解决您澄清的问题,您可以重构initial_screen.state和login.state,使它们以state开头,以end_state结尾。然后你可以做:

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

…这相当于您所追求的-它只是一个包含而不是添加状态。

要解决您澄清的问题,您可以重构initial_screen.STATE和login.STATE,使它们以状态开始,以结束状态结束。然后你可以做:

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

…这相当于您所追求的内容-这只是一个包含而不是添加状态。

编辑您的第一篇文章而不是添加评论可能更好。谢谢您,安德斯,我没有意识到我可以这样做,我已经添加了编辑。编辑您的第一篇文章而不是添加评论可能更好。谢谢您,安德斯,我没有意识到我可以这么做,我已经添加了编辑。谢谢你,LnxPrgr3,我必须阅读文档,看看它是否与我的学校电脑兼容,但这是我一直渴望的事情,我想^^^哈哈,它已经安装在我的学校电脑上了^ ^非常感谢:谢谢你,LnxPrgr3,我将不得不阅读文档,看看它是否与我的学校电脑兼容,但这是我一直渴望的东西,我想^^^哈哈,它已经安装在我的学校电脑上了^ ^非常感谢你:D