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

时间:2010-07-28 05:00:43

标签: c++ include c-preprocessor

我对C ++有点新意,所以请耐心等待。我正在试图弄清楚我的#defines#includes在我的项目中的确切位置。我有这样的事情:

main.h

#include "other.h"

#define MAX_GROUPS 100

struct Cat
{
    int something[MAX_GROUPS];
}

other.h中我还需要使用MAX_GROUPS,因此我还要在MAX_GROUPS中定义other.h,如下所示:

other.h

#define MAX_GROUPS 100

struct Other
{
     int taco[MAX_GROUPS];
}

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

或者,我是否重新加入main.h

other.h

#include "main.h"

struct Other
{
     int taco[MAX_GROUPS];
}

这里的问题我认为它的存在就像一个循环的依赖性东西。 main.h包括other.h,其中包含main.h,其中包含other.h,其中包括等等...

为项目设置定义和包含的最佳方法是什么,以便将事物排序到其他包含的文件?通常的做法是在包含之前简单地完成所有定义吗?

4 个答案:

答案 0 :(得分:5)

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

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

#ifndef HEADER_THING_H
#define HEADER_THING_H

/* Rest of the header file goes here. */

#endif

如果它已经包含在内,那就无害了。

答案 1 :(得分:2)

因为main.h #includes other.h,所以不需要再次#define MAX_GROUPS。它将从包含中获取该定义。

答案 2 :(得分:0)

通常,您应该将定义放在相关的标题内 - 或者主要使用它的位置。在这种情况下,您应该将MAX_GROUPS放在other.h中。通过在main.h中包含other.h,也可以获取定义(如jwismar所述)。

但是,对于更大的项目,最好创建一个只包含清单常量(定义)的头文件,并在需要的地方包含它。

答案 3 :(得分:0)

你也可以保护你的常数不受重新定义的影响......

#ifndef MAX_GROUPS
#define MAX_GROUPS 100
#endif