C++ header 多变量指针包含

标签 c++ pointers include global-variables declaration

我遇到了这样的问题:

我有一个头文件:

//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/

相关文章:

C++字符串问题

c++ - ZMQ_CONFLATE 套接字选项导致未收到消息

c++ - 如何获取 Windows 7 中“开始”按钮的句柄?

C 指针、结构和 fwrite

php - 我可以将关联数组发送到包含的 Twig 模板中吗?

c++ - 是否可以判断 C++ 文件何时是主要源文件?

c++ - Qt - QTcpserver 工作不正常

c++ - 如何获取当前持有的变体类型,并定义该类型的新变量

go - 指针 (GoLang)

c++ - 指向 vector 和数组指针的指针