【问题标题】:C Programming: Preprocessor, include files from macroC 编程:预处理器,包含宏中的文件
【发布时间】:2009-11-20 02:51:05
【问题描述】:

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

#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)

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

【问题讨论】:

  • 编辑你的第一篇文章可能比添加 cmets 更好。
  • 谢谢你,安德斯,我没有意识到我能做到这一点,我已经添加了编辑。

标签: c macros include c-preprocessor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢你,LnxPrgr3,我必须阅读文档,看看它是否与我的学校计算机兼容,但这是我一直渴望的东西,我想 ^ ^
    • 大声笑,它已经安装在我学校的电脑上^_^ 非常感谢:D
    【解决方案3】:

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

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

    ...这相当于您所追求的 - 它只是一个 #include 而不是 ADD_STATE

    【讨论】:

      【解决方案4】:

      在文件中包含.h

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

      在所有其他文件中

      #include "includes.h"
      

      【讨论】:

        【解决方案5】:

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

        相反,执行此操作的典型方式是创建一个包含所有所需#include 的小型包含文件。请参阅 Cory Petosky 的回复以获取说明。

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

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

        编辑:这只是在 ;-)
        有人刚刚问了这个 SO 问题 Good idea to put all project headers into one file?,回复似乎普遍同意我的看法,即分组标题通常没有什么好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 2023-03-03
          • 2010-12-18
          • 2020-02-09
          • 2021-04-06
          • 2019-06-22
          相关资源
          最近更新 更多