在h文件中声明的c ++静态数组给出了'已定义但未使用'的警告

时间:2013-01-27 09:58:33

标签: c++ static const header-files

我对以下内容感到好奇。我在头文件中声明了一个简单的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会删除它们?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

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

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