我有以下代码
// header
const char* NAME1 = "C++"; // linker error
const char* const NAME2 = "C++"; // fine
Run Code Online (Sandbox Code Playgroud)
如果此头文件包含在多个源文件中,则第一个声明将导致链接器错误
ld:体系结构x86_64的1个重复符号
为什么允许第二个声明?在包含标头的两个源文件中,NAME2标识符的地址都相同。因此,以某种方式使NAME2成为常量指针也会改变其链接。这是如何运作的?
未声明extern且先前未声明具有外部链接的非易失性非内联const限定变量,在名称空间范围内声明,具有内部链接(请参阅https://en.cppreference.com/w/cpp/语言/ storage_duration#Linkage)。
NAME1指向const char,但不是const,它具有外部链接。NAME2是const这样它得到内部联系