c ++标题多个变量指针包含

Teb*_*ebe 0 c++ pointers declaration global-variables include

我遇到了这样的问题:

我有一个头文件:

//first variant:  
#ifndef LIBRARIES_H
#define LIBRARIES_H
 const char a='4';    
 #endif // LIBRARIES_H
Run Code Online (Sandbox Code Playgroud)

我将它包含在几个.cpp文件中.一切都很完美.

但突然间,如果我宣布一个指针:

//second variant:
#ifndef LIBRARIES_H
  #define LIBRARIES_H
 const char *a="asdfgh";
 #endif // LIBRARIES_H
Run Code Online (Sandbox Code Playgroud)

请注意,我只声明其中一个(变种).
我只宣告了一次(我试图更改sadfgh或asdfg的名称).

当我尝试第二个变体时,我先删除,反之亦然.

如果我声明一个指向字符串的指针,我将得到错误"多次包含变量".我用qt编译它.我已经删除并重新编译了几次项目. 在此输入图像描述

当然,我可以在main()函数中定义它,但我想知道,这个问题的原因是什么?为什么我不能在头文件中声明指针,然后将它包含在几个源代码文件中?

Che*_*Alf 5

const char a='4';
Run Code Online (Sandbox Code Playgroud)

手段

char const a = '4';
Run Code Online (Sandbox Code Playgroud)

你可以向后读,因为"4 a是一个常数的初始值char".

由于这a是常数,它具有内部连接(即它不暴露给其他翻译单元).

另一方面,

const char *a="asdfgh";
Run Code Online (Sandbox Code Playgroud)

手段

char const * a = "asdfgh";
Run Code Online (Sandbox Code Playgroud)

你可以向后读作"asdfgh"是一个用于初始化的数组,a它作为指向常量的指针char".

在这种情况下,a本身不是const,因此默认情况下不会获得内部链接:它具有外部链接.

当您将标题包含在两个或多个翻译单元中时,会因此调用两个或更多全局和不同的对象a,这违反了C++ 的One Definition Rule(通常称为ODR).

一种治疗方法是使a自己const,

char const * const a = "asdfgh";
Run Code Online (Sandbox Code Playgroud)

现在尝试读取向后,到它的意义.