考虑以下头文件示例: shared_example.h
#ifndef SHARED_EX
#define SHARED_EX
const int Shared_Int = 1;
const char * Shared_CString = "This is a string";
#endif
shared_example.h 文件包含在多个编译单元中,这导致链接器(正确地)抱怨:
error LNK2005: "char const * const Shared_CString" (?Shared_CString@@3PBDB) already defined in First_Compilation_Unit.obj
从此文件中删除Shared_CString常量可消除此问题。
所以,我有两个问题。
首先,为什么Shared_Int常量不会触发相同的问题?
其次,允许单独的编译单元使用相同的常量字符串值的适当方法是什么?
答案 0 :(得分:16)
第一个声明具有常数整数值。在C ++中,const
默认具有内部链接。
第二个声明是指向const char
的指针。该声明本身不是const
,并且没有其他链接说明符,因此它没有内部链接。如果您将声明更改为const char * const
,那么它将成为const char
的const指针并具有内部链接。
答案 1 :(得分:4)
<强> shared_example.h 强>
#ifndef SHARED_EX
#define SHARED_EX
extern const int Shared_Int;
extern const char * Shared_CString;
#endif
<强> shared_example.c 强>
const int Shared_Int = 1;
const char * Shared_CString = "This is a string";
答案 2 :(得分:1)
使它们静止将解决问题。 您没有看到Shared_Int,因为您没有在您编译的c模块中使用它。
编辑:我的坏 - 我说的对C有效。没有看到c ++标签。遗憾