未定义的常量数组引用

fre*_*low 8 c++ arrays linker const header

a.cpp

const unsigned char whatever[123] = { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

extern const unsigned char whatever[123];
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include "a.h"
unsigned char x = whatever[0];
// error: undefined reference to 'whatever'
Run Code Online (Sandbox Code Playgroud)

为什么我会收到未定义的引用错误?如果没有const,错误就会消失.

如何在多个翻译单元之间共享常量数组?

小智 11

这是人们遇到的一个怪癖,只是你定义了一个ah头文件,它声明了一个包含123个字符的const数组,并为它分配了外部链接.当它被包含在b.cpp文件中时,你基本上承诺它将在其他一些翻译单元中找到它的编译器.

但是,每个const变量都有一个黑暗的秘密 - 它被困在其定义的翻译单元中,因为它隐含地给出了静态链接.您承诺您的编译器whatever将在多个翻译单元之间共享,但它实际上只忠于一个翻译单元而不喜欢共享.而且,嗯,你知道其余的.

通过明确声明extern实现文件来解决.


Vik*_*pov 5

3.5/3\n\n A name having namespace scope (3.3.5) has internal linkage if it is the name of\n ...\n \xe2\x80\x94 an object or reference that is explicitly declared const and neither explicitly declared extern nor previously declared to have external linkage;\n ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

变量就像

\n\n
 const int x = 10;\n
Run Code Online (Sandbox Code Playgroud)\n\n

隐式定义为“静态”。

\n\n

要使它们成为非静态(因此非内部),请在“.c”文件中使用“extern”修饰符。

\n\n

尝试使用

\n\n
extern const unsigned char whatever[123] = { /* ... */ };\n
Run Code Online (Sandbox Code Playgroud)\n