我对以下内容感到好奇。我在头文件中声明了一个简单的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
会删除它们?
答案 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”的文档:
答案 1 :(得分:5)
静态变量是它们所定义的转换单元的本地变量。当您在标题中执行此操作时,您会在每个包含它的cpp文件中获得单独的副本。可能不是您想要的。编译器显然注意到根本没有使用其中一些副本。
当您添加const
时,您会遇到不同的情况。在C ++中,默认情况下,文件范围内的const对象也是静态的。所以const
和static const
意味着同样的事情。
常量数组在每个cpp文件中也会有一个副本,但这并不重要,因为它总是具有相同的值。