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

时间:2011-09-26 20:15:33

标签: c++ header linker

考虑以下头文件示例: 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常量不会触发相同的问题?

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

3 个答案:

答案 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 ++标签。遗憾