代码之家  ›  专栏  ›  技术社区  ›  Jake Wilson

循环声明预处理器指令?或者在包含之前定义?

  •  0
  • Jake Wilson  · 技术社区  · 14 年前

    我对C++有点陌生,所以请容忍我。我想弄清楚我的车到底放在哪里 #defines #includes 在我的项目中。我有这样的想法:

    主.h

    #include "other.h"
    
    #define MAX_GROUPS 100
    
    struct Cat
    {
        int something[MAX_GROUPS];
    }
    

    other.h 我还需要使用 MAX_GROUPS ,我也要定义 其他.h 这样地:

    其他.h

    #define MAX_GROUPS 100
    
    struct Other
    {
         int taco[MAX_GROUPS];
    }
    

    问题是,我定义了一个常数不止一个地方。我想把它放在一起。

    或者,我是否重新包括 main.h ?

    其他.h

    #include "main.h"
    
    struct Other
    {
         int taco[MAX_GROUPS];
    }
    

    我认为这里的问题是,它像一个循环依赖的东西。 主.h 包括 其他.h 其中包括 主.h 其中包括 其中包括。。。

    为一个项目设置defines和includes的最佳方法是什么,这样就可以将一些东西级联到其他包含的文件中?在你的include之前简单地做所有的define是一种常见的做法吗?

    4 回复  |  直到 9 年前
        1
  •  5
  •   janm    14 年前

    最小化循环依赖关系对于维护项目非常重要。对于扩展的讨论,请参见John Lakos的“大规模C++软件设计”。

    要避免出现特定问题,请在一个头文件中定义值,并将该头文件包含在每个需要它的文件中。要避免多个定义出现问题,请使用include guards:

    #ifndef HEADER_THING_H
    #define HEADER_THING_H
    
    /* Rest of the header file goes here. */
    
    #endif
    

    这样,如果它已经包括在内,它是无害的。

        2
  •  2
  •   jwismar    14 年前

    因为main.h#包含了other.h,所以它不需要再次定义MAX#u组。它将从包含中得到这个定义。

        3
  •  0
  •   vij    14 年前

    通常,您应该将defines放在任何相关的头中——或者放在它主要使用的地方。在这种情况下,应该将MAX\u组放在other.h中。通过在main.h中包含other.h,define也将被选中(正如jwismar所提到的)。

        4
  •  0
  •   Brian Hooper    14 年前

    你也可以保护你的常数不被重新定义。。。

    #ifndef MAX_GROUPS
    #define MAX_GROUPS 100
    #endif