C++在头文件中声明的静态数组出现了警告“已定义但未使用”

9

我很好奇以下内容。我在头文件中声明了一个简单的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 可以解决?


警告并不意味着代码有错,它们可能只是风格问题。在头文件中有很多常量而并非总是使用它们是很正常的。然而,对于可变对象来说,这可能是某些问题的标志。 - Marc Glisse
2个回答

17

简单来说:你在头文件中定义了一个数组,而不仅仅是声明。这不好。如果你需要在包含头文件时随时访问该数组,则应在头文件中进行声明,如下所示:

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

5
静态变量是局部于其所在的翻译单元的。如果你在头文件中这样做,那么当你将其包含在每个cpp文件中时,会得到一个单独的副本。这可能不是你想要的。编译器显然注意到其中一些副本根本没有被使用。
当你添加const时,情况就不同了。在C++中,文件作用域上的const对象也默认为静态的。因此,const和static const意思相同。
常量数组在每个cpp文件中也会有一个副本,但这并不重要,因为它总是具有相同的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接