C++ 共享标头导致多重定义符号错误
考虑以下头文件示例:shared\u example.hC++ 共享标头导致多重定义符号错误,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
#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 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文件来自没有关联主体的头文件。这当然是另一种管理它的方法。谢谢