共享标头导致多重定义符号错误
Shared Header Causes Multiply Defined Symbol Error
考虑以下头文件示例: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++标签。抱歉
相关文章:
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 带有限定符的函数类型定义用例
- 有没有办法构建C++自定义限定符?
- 使用无效指针初始化指针声明符的行为是否未定义?
- 从一个函数和某些类型指定符定义整个派生类的宏
- TensorFlow类占位符以及其他定义输入张量的方法
- Eclipse CDT将方法定义定义到标头文件
- 读取文件内容时未定义的字符,文件末尾没有换行符
- 增强自定义权重到boost :: grid_graph中的边缘描述符
- 为什么编译器需要在已经类限定的成员函数定义的返回类型上使用类限定符
- C++ 错误 C2373 重新定义不同的类型修饰符
- 声明和定义之间常量限定符的使用不一致
- 如何从一组已定义的描述符动态构建新的 protobuf
- CTOR 声明/定义中接受的 const 限定符(LLVM 错误?)
- 运算符 +' : 重定义;不同类型的修饰符
- LEX 程序中的未定义定义
- 如何避免SOCI错误:提取了Null值,但未定义指示符
- 在编译时自定义/重写符号名
- 如何为流化自写类编写用户定义操纵符
- c++,将自定义占位符与函数参数匹配