1

如果我执行以下操作:

dConst.hpp

const int POWER_LEVEL = 9001;

genPower.hpp

#include "dConst.hpp"

#ifndef GENPOWER_HPP
#define GENPOWER_HPP

const int GENERATOR[1] = { POWER_LEVEL };

#endif

对于任何使用生成器数组常量的代码,我最终都会遇到链接器错误。

#include "dConst.hpp"但是,如果我用代码块切换:

#ifndef GENPOWER_HPP
#define GENPOWER_HPP

有用...

我是不是在滥用权力#ifndef

4

2 回答 2

1

你没有充分利用#ifndef 的力量。

您的dConst.hpp文件需要包括警卫。否则,如果它包含在翻译单元中的多个文件中,则会导致问题(您看到的确切问题)。

编辑:我还将您的包含保护放在genPower.hpp文件顶部,在您的包含语句之前。

于 2013-11-24T19:42:48.990 回答
1

当然是。

包含守卫的重点是确保您的代码不会被包含两次 - 如果您的头文件中有一些代码不在包含守卫内,如果您两次包含该标头,那么您将两次定义守卫之外的所有内容.

为了更好地了解正在发生的事情,您生成的代码如下所示:

#include 基本上只是将包含文件的内容直接插入到另一个文件中,这意味着您的 genPower.hpp 看起来像这样(没有正确放置包含保护,就像您最初在您的问题中一样):

const int POWER_LEVEL = 9001;

#ifndef GENPOWER_HPP
#define GENPOWER_HPP

const int GENERATOR[1] = { POWER_LEVEL };

#endif

因此,每次包含该文件时,在到达 #ifndef 之前,都会定义 POWER_LEVEL。如果您使用#ifndef/#define 切换POWER_LEVEL 行,每次包含此文件时,它将首先检查它是否已包含(使用#ifndef - 如果已包含,则#define 应该已经完成​​了它的工作) 并且只有在那时(一旦发现这是第一次)它才会定义 POWER_LEVEL。

此外,您几乎肯定也希望在 dConst.hpp 上包含保护 - 所有标头都应该包含保护,并且它们应该保护头文件中的所有内容。这是您对#ifndef 的错误。

于 2013-11-24T19:48:15.483 回答