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

And*_*kha 8 c++ static const header-files

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

static int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};
Run Code Online (Sandbox Code Playgroud)

它给了我一堆警告:

: 'userCardsIndexes' defined but not used
Run Code Online (Sandbox Code Playgroud)

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

static const int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};
Run Code Online (Sandbox Code Playgroud)

警告消失了!任何人都可以给我一个解释为什么我得到这些警告以及为什么要const删除它们?

she*_*heu 16

简短的回答是:你在标题中定义一个数组,而不只是声明它.这个不好.如果在包含标题时需要访问数组,则标题中应该有一个声明:

extern int userCardsIndexes[INITIAL_CARDS_NUMBER];
Run Code Online (Sandbox Code Playgroud)

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

int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};
Run Code Online (Sandbox Code Playgroud)

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

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


Bo *_*son 5

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

当你添加const你有不同的情况.在C++中,默认情况下,文件范围内的const对象也是静态的.所以const并且static const意味着同样的事情.

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