C++ 由于C+;中指针数组的常量而导致链接错误+;03/C++;11

C++ 由于C+;中指针数组的常量而导致链接错误+;03/C++;11,c++,c++11,constants,linker-errors,compiler-bug,C++,C++11,Constants,Linker Errors,Compiler Bug,此问题可在-std=c++14之前的g++中重现。由于以下代码中突出显示的const,会生成链接错误。如果移除RHSconst,它将消失 /* main.cpp */ const char* const arr[2] = {"Hello", "World"}; // ^^^^^ int main () {} 及 编译时:g++[-std=c++11]main.cpp foo.cpp,它给出以下链接错误: In function `foo()': undefined refer

此问题可在
-std=c++14
之前的g++中重现。由于以下代码中突出显示的
const
,会生成链接错误。如果移除RHS
const
,它将消失

/* main.cpp */
const char* const arr[2] = {"Hello", "World"};
//          ^^^^^
int main () {}

编译时:
g++[-std=c++11]main.cpp foo.cpp
,它给出以下链接错误:

In function `foo()': undefined reference to `arr'  

这是编译器错误还是语言限制/功能?

正如昆廷所注意到的,n4296草案在第3.5章程序和链接[basic.link]§3(强调我的)中明确了这一点

如果名称空间范围(3.3.6)为
的名称,则该名称具有内部链接 (3.1)-明确声明为静态的变量、函数或函数模板;或者,
(3.2)一种非易失性常量限定类型的变量,既没有显式声明外部变量,也没有先前声明 宣布有外部联系

当您将
arr
声明为const时,它被隐式地指定为内部链接。解决方法很简单:

/* main.cpp */
extern const char* const arr[2] = {"Hello", "World"};
但最佳实践建议使用
extern const char*const arr[2]arr
在所有文件中包含的头中添加code>,以便正确共享声明,然后添加其中一个文件
const char*const arr[2]={“Hello”,“World”},有效地产生:

/* main.cpp */
extern const char* const arr[2]; // directly or more likely through an include...
...
const char* const arr[2] = {"Hello", "World"};

命名空间范围中的
const
变量,除非添加
extern
。我不知道为什么行为会随着
-std=c++14
而改变。不应该
外部常量char*const arr[2]
是否位于
main.cpp
foo.cpp
都包含的头文件中?@Quentin我不确定OP为什么说c++14之前的g++5.1.0在任何模式下都会产生错误(c++14 c++17),您的注释应该是答案不能在GCC 6.1上复制,所有
std
标志的行为都是一致的。
/* main.cpp */
extern const char* const arr[2]; // directly or more likely through an include...
...
const char* const arr[2] = {"Hello", "World"};