共享标头导致多重定义的符号错误

Gre*_*reg 9 c++ linker header

请考虑以下头文件示例:shared_example.h

#ifndef SHARED_EX
#define SHARED_EX

const int    Shared_Int     = 1;
const char * Shared_CString = "This is a string";

#endif
Run Code Online (Sandbox Code Playgroud)

shared_example.h文件包含在多个编译单元,从而导致链接器(正确地)抱怨说:

error LNK2005: "char const * const Shared_CString" (?Shared_CString@@3PBDB) already defined in First_Compilation_Unit.obj

从此文件中删除Shared_CString常量可消除此问题.

所以,我有两个问题.

首先,为什么Shared_Int常量不会触发相同的问题?

第二,允许单独的编译单元使用相同的常量字符串值的适当方法是什么?

MSN*_*MSN 16

第一个声明具有常数整数值.在C++中,const默认情况下具有内部链接.

第二个声明是指向const char.该声明const本身并不存在,并且没有其他链接说明符,因此它没有内部链接.如果您将声明更改为const char * const它将成为一个const指针const char并具有内部链接.