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
实现文件来解决.
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\nextern const unsigned char whatever[123] = { /* ... */ };\n
Run Code Online (Sandbox Code Playgroud)\n