在 h 文件中声明的 c++ 静态数组给出警告 'defined but not used'

标签 c++ static constants 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 会删除它们?

最佳答案

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

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

关于在 h 文件中声明的 c++ 静态数组给出警告 'defined but not used',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546253/

相关文章:

c++ - GCC 允许 1 行声明多个指针,但不是非指针,具有不同的 const 限定符

c++ - 为什么 CopyConstructible 定义提到 "rvalue expression of const T"?

c++ - 一旦 cudaMalloc 返回内存不足,每个 cuda API 调用都会返回失败

c++ - std::vector<Simd_wrapper> 是否在内存中有连续的数据?

C++ 单例实例禁用重新调用

java - 静态变量作为全局变量,静态对象何时被垃圾收集?

c++ - strchr, memchr 定位字符失败

C++ std::vector - 如何修改迭代器指定的元素?

perl - 在 Perl/Moose 中,如何在父类中创建可从子类访问的静态变量?

c++ - const 函数的编译器错误