我遇到了这样的问题:
我有一个头文件:
//first variant:
#ifndef LIBRARIES_H
#define LIBRARIES_H
const char a='4';
#endif // LIBRARIES_H我将其包含在几个.cpp文件中。一切都运行得很完美。
但是突然,如果我声明一个指针:
//second variant:
#ifndef LIBRARIES_H
#define LIBRARIES_H
const char *a="asdfgh";
#endif // LIBRARIES_H请注意,我只声明了其中的一个(变体)。
I DECLARE a only once(I tried to change name for sadfgh or asdfg).当我尝试第二个变体时,我先删除,反之亦然。
如果我声明一个指向字符串的指针,我会得到错误"multiple inclusion of variable“。我使用qt编译它。我已经删除并重新编译了几次项目。

当然,我可以在main()函数中定义它,但是我想知道这个问题的原因是什么?为什么我不能在头文件中声明指针,然后在几个源代码文件中包含它?
发布于 2012-03-19 04:14:09
const char a='4';手段
char const a = '4';您可以将其反向读取为“4是a的初始值,它是一个常量char”。
由于此a是恒定的,因此它具有内部链接(即,它不会暴露给其他翻译单元)。
另一方面,
const char *a="asdfgh";手段
char const * a = "asdfgh";你可以将其反向读取为“”asdfgh“”是用于初始化a的数组,该数组是指向常量char的指针“。
在这种情况下,a本身不是const,因此默认情况下不会获得内部链接:它具有外部链接。
当您将头包含在两个或多个转换单元中时,您会得到两个或多个称为a的全局且不同的对象,这违反了C++的单一定义规则(通常被称为ODR)。
一种解决方法是让a本身成为const,
char const * const a = "asdfgh";现在试着倒着读,弄明白它的意思。
发布于 2012-03-19 03:59:25
Edit2显然,我之前的建议是改变
const char* a = "asdfgh"至
const char[6] a= "asdfgh"很管用。
我仍然在研究它,但是当你声明一个指针时,你只是说这个指针是常量,而不是它所指向的内存。当你声明一个数组时,你是在说const后面的数据也是不可变的。我正在进一步调查。
Edit3:this的第二段解释了发生了什么。
此外,“干杯”的答案很好地解释了这一点。
发布于 2012-03-19 04:01:40
奇伊的答案比我的好,但是...
尝试将声明更改为:
extern const char * const a;然后在其中一个cpp文件中,这样写:
const char * a = "asdf";(不过,如果你有两个常量,
const char * const a = "asdf";应该可以工作)。
除非你同时拥有两个常量,否则你不会得到静态链接。因此,如果同时使用两个const,它应该可以工作,无论是外部的还是静态的。
https://stackoverflow.com/questions/9761718
复制相似问题