字符* 常量值 ERROR 与 GNU G++ 编译器

The char* constant value ERROR with GNU G++ compiler

本文关键字:GNU G++ 编译器 ERROR 常量 字符      更新时间:2023-10-16

我编写具有以下关系的 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";