8

我很好奇以下内容。我在头文件中声明了一个简单的 C 数组,如下所示:

static int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

它给了我一堆警告:

: 'userCardsIndexes' defined but not used

尽管我将此文件包含在我的 cpp 文件中并使用此变量。我不明白的第二件事是当我添加const这样的说明符时:

static const int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

警告消失!谁能给我解释为什么我收到这些警告以及为什么要const删除它们?

4

2 回答 2

16

简短的回答是:您在标头中定义一个数组,而不仅仅是声明它。情况不妙。如果您需要在包含标题时访问该数组,则标题中应该有这样的声明:

extern int userCardsIndexes[INITIAL_CARDS_NUMBER];

然后,仅在一个源文件中,将数组定义为:

int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

至于长答案:头文件没有什么“神奇”的。该#include指令基本上只是将头文件的全部内容复制到源文件中。所以本质上,你得到的是userCardsIndexes在每个源文件中定义的一个新的静态数组;如果未使用此数组,则会收到“未使用的变量”警告。预先设置const可能会抑制警告,因为编译器未配置为对const未使用的变量发出警告。例如:使用 GCC,查看“-Wunused-variable”的文档:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

于 2013-01-27T10:12:05.320 回答
5

静态变量对于定义它们的翻译单元是本地的。当您在标题中执行此操作时,您会在包含它的每个 cpp 文件中获得一个单独的副本。可能不是您想要的。编译器显然注意到其中一些副本根本没有使用。

当您添加时,const您会遇到不同的情况。在 C++ 中,文件范围内的 const 对象默认也是静态的。所以conststatic const意思是一样的。

常量数组在每个 cpp 文件中也会有一个副本,但这并不重要,因为它总是具有相同的值。

于 2013-01-27T10:10:22.600 回答