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

Shared Header Causes Multiply Defined Symbol Error

本文关键字:定义 定义符 符号 错误 共享      更新时间:2023-10-16

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

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

第一个声明是一个常量整型值。在c++中,const默认具有内部链接。

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

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";

将它们设置为静态将解决这个问题。你没有看到Shared_Int,因为你没有在编译的多个c模块中使用它。

编辑:我的错-我说的是有效的c .没有看到c++标签。抱歉