C++ c++;标题多变量指针包含

C++ c++;标题多变量指针包含,c++,pointers,include,global-variables,declaration,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";

我遇到了这样的问题:

我有一个头文件:

//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的名称)

当我尝试第二个变量时,我删除第一个变量,反之亦然

如果我声明一个指向字符串的指针,我将得到错误“多重包含变量”。 我使用qt编译它。我已经删除并重新编译了几次这个项目。


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

Edit2显然,我先前建议的更改

const char* a = "asdfgh"

工作

我还在研究它,但是当你声明一个指针时,你只是说这个指针是常量,而不是它指向的内存。当您声明一个数组时,您的意思是常量后面的数据也是不可变的。我正在进一步调查

编辑3:第二段解释了发生了什么


另外,“Cheers”的回答也很好地解释了这一点。

Cheer的回答比我的好,但是

尝试将您的声明更改为:

extern const char * const a;
然后在一个cpp文件中,说:

const char * a = "asdf";
(但如果两个常量都有

const char * const a = "asdf";
应该有效)

除非两个常量都有,否则不会得到静态链接。因此,如果您同时使用这两个常量,它应该可以工作,无论是外部的还是静态的

const char a='4';
意味着

您可以将其向后读取为“4是
a
的初始值,它是一个常量
char

由于该
a
是常数,因此它具有内部链接(即,它不暴露于其他翻译单元)

另一方面,

const char *a="asdfgh";
意味着

可以将其向后读取为“asdfgh”是一个用于初始化
a
的数组,该数组作为指向常量
char
的指针

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

当你将头包含在两个或多个翻译单元中时,你会得到两个或更多个全局和不同的对象,称为“代码> A<代码>,这违反了C++的一个定义规则(通常称为<强> ODR )。 解决方法之一是使

a
本身
const

char const * const a = "asdfgh";

现在试着向后看,理解它。

- 1不是真正的代码(例如<代码> CONT/COM>不是C++关键字)。哦,天哪,我只是把它弄错了!我是一个人。它如何影响业务?const char*是声明字符常量,而不是指针。我还没有测试过它,但我想它更可能与“char*const”或“const char*const”一起使用。另一个选择是将其声明为extern,并在.cpp文件中定义。布莱斯·瓦格纳,我不明白你的意思。我写道我可以在cpp中声明它是愚蠢的。@shbk:明显的打字错误“触动了业务”:它显然不是真正的代码。因此,您提供的代码都不是真实的,如果问题稍微复杂一点,我甚至懒得回答,因为很可能会浪费时间帮助不应该帮助的人(比如帮助一位老人过街,然后她就在车流中跑回)和被人拖走。你问题中表现出的矫揉造作同样是一种不必费心回答的迹象。工程师们不这么认为。好吧,你之前写过,我应该声明const char[5]=“sdsfgd”。你是对的。它起作用了。但是为什么const char*sdf=“sdfg”不起作用呢?相信我,我重新命名了它,真的我想添加一些。我在这里遇到的所有问题都是由内部和外部联系造成的(正如你所说的)。我们可以使用extern(即分别表示外部变量)和static(不明显,但表示变量是内部变量)显式地控制它。因此,我可以将其声明为:static const char*s=“sdf”(这只是一个替代解决方案)
const char *a="asdfgh";
char const * a = "asdfgh";
char const * const a = "asdfgh";