我编写具有以下关系的 sevaral 文件:
文件 A.h:
#ifndef MACRO_HEADER
#define MACRO_HEADER
const char* CONST_CHAR_NAME = "name";
#endif
文件 B.h(B.cpp) 和文件 C.h(C.cpp) 也包含此通用类型定义标头 A.h。当 g++ 最终将 obj 文件合并到 lib 时,它会给出重定义错误。我承认我犯了一个错误,我应该将常量定义为:
const char* const CONST_CHAR_NAME = "name"; //This is OK
但是为什么编译器给我一个重新定义错误?常量字符* 不是常量值吗?但我用 typeid.name 来检查const char *
和cosnt char* const
的类型.它们是相同的:char const * 。我对错误感到困惑。
问题是您在多个位置定义相同的变量名称,即包含 .h 的每个源文件。
通过使用 static
关键字将每个定义声明为源文件的本地定义,可以消除链接器错误:
static const char* CONST_CHAR_NAME = "name";
它给出错误,因为CONST_CHAR_NAME
是在多个"翻译单元"中定义的(翻译单元基本上是单个源文件和所有包含的头文件)。您必须声明它extern
然后在一个源文件中定义常量。
所以在头文件中:
extern const char* CONST_CHAR_NAME;
在一个源文件中:
const char* CONST_CHAR_NAME = "name";
编辑:const char*
和const char* const
之间的区别
宣言
const char* CONST_CHAR_NAME;
创建指向常量字符串的指针。您可以分配给它,只要它指向常量字符串即可。即下面的两行都可以:
CONST_CHAR_NAME = "foo";
CONST_CHAR_NAME = "bar";
另一方面,你有
const char* const CONST_CHAR_NAME;
上面创建了一个指向常量字符串的常量指针。这意味着您无法再次分配给指针,因此上面的两个分配是不行的。
实际上你应该把它声明为:
const char CONST_CHAR_NAME[] = "name";