0

我写了几个文件,关系如下:

档案啊:

#ifndef MACRO_HEADER
#define MACRO_HEADER
const char* CONST_CHAR_NAME = "name";
#endif

file Bh(B.cpp) 和 file Ch(C.cpp) 也包含这个通用类型定义头 Ah 当g++最终将obj文件合并到lib时,它给出了他重新定义的错误。我承认我犯了一个错误,我应将常量定义为:

const char* const CONST_CHAR_NAME = "name"; //This is OK 

但是为什么编译器会给我一个重新定义的错误呢?const char* 不是常量值吗?但我使用 typeid.name 来检查const char *and 的类型cosnt char* const。它们是相同的:char const *。我对错误感到困惑。

4

3 回答 3

2

问题是您在多个地方定义了相同的变量名,即每个包含.h 的源文件。

static您可以通过使用关键字将每个定义声明为源文件的本地来消除链接器错误:

static const char* CONST_CHAR_NAME = "name";
于 2012-09-17T03:48:13.227 回答
1

它给出了错误,因为在多个“翻译单元”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;

上面创建了一个指向常量字符串的常量指针。这意味着你不能再给指针赋值,所以上面的两个赋值都不行。

于 2012-09-17T03:27:44.990 回答
-1

实际上,您应该将其声明为:

const char CONST_CHAR_NAME[] = "name";
于 2012-09-17T03:32:52.523 回答