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()函数中定义它,但我想知道,这个问题的原因是什么?为什么我不能在头文件中声明指针,然后将它包含在几个源代码文件中?
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)
现在尝试读取该向后,到它的意义.
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |