我遇到了这样的问题:
我有一个头文件:
//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
请注意,我只声明其中一个(变体)。
我只声明一次(我试图更改 sadfgh 或 asdfg 的名称)。
当我尝试第二种变体时,我先删除,反之亦然。
如果我声明一个指向字符串的指针,我将得到错误“multiple inclusion of variable”。 我使用qt编译它。我已经删除并重新编译了几次项目。
当然,我可以在main()函数中定义它,但我想知道,这个问题的原因是什么?为什么我不能在头文件中声明指针,然后将其包含在少数源代码文件中?
最佳答案
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
,因此默认情况下不会获得内部链接:它具有外部链接。
当您将 header 包含在两个或多个翻译单元中时,您会因此获得两个或多个称为a
的全局和不同对象,这违反了 C++ 的单一定义规则 (通常简称为 ODR)。
一种解决方法是使a
本身const
,
char const * const a = "asdfgh";
现在尝试向后阅读那个,以理解它。
关于C++ header 多变量指针包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761718/