Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享标头导致多重定义符号错误_C++_Header_Linker - Fatal编程技术网

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

C++ 共享标头导致多重定义符号错误,c++,header,linker,C++,Header,Linker,考虑以下头文件示例:shared\u example.h #ifndef SHARED_EX #define SHARED_EX const int Shared_Int = 1; const char * Shared_CString = "This is a string"; #endif #ifndef SHARED_EX #define SHARED_EX extern const int Shared_Int; extern const char * Sha

考虑以下头文件示例:shared\u example.h

#ifndef SHARED_EX
#define SHARED_EX

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

#endif
#ifndef SHARED_EX
#define SHARED_EX

extern const int    Shared_Int;
extern const char * Shared_CString;

#endif
共享_example.h文件包含在多个编译单元中,这会导致链接器(正确地)抱怨:

错误LNK2005:“char const*const Shared_CString”(?Shared_CString@@3PBDB)已在第一个编译单元中定义。obj

从该文件中删除Shared_CString常量可以消除该问题

所以,我有两个问题

首先,为什么Shared_Int常量不会引发同样的问题


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

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


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

共享\u example.h

#ifndef SHARED_EX
#define SHARED_EX

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

#endif
#ifndef SHARED_EX
#define SHARED_EX

extern const int    Shared_Int;
extern const char * Shared_CString;

#endif
共享\u示例.c

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

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


<>编辑:我的坏-我说的是有效的,C.没有看到C++标签。抱歉

简洁明了。杰出的关于内部和外部链接的阅读的好消息,有什么建议?@格雷戈,除了C++标准之外,IBM还有一些很好的C++文档。当然,编译器文档也应该有一些关于他们和其他C++复杂的文档。你确定你在代码> C++ +代码>中编译,或者只是用C/C++编译器编译?@ Itsik,我试图用C++来编码,但这可能只是个白日梦。我试图避免这个特殊的解决方案。由于我的shared_example.h文件来自没有关联主体的头文件。这当然是另一种管理它的方法。谢谢