gpt4 book ai didi

C++ header 多变量指针包含

转载 作者:太空宇宙 更新时间:2023-11-04 15:25:21 25 4
gpt4 key购买 nike

我遇到了这样的问题:

我有一个头文件:

//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编译它。我已经删除并重新编译了几次项目。 enter image description here

当然,我可以在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com