C++ 在C+的头文件中使用常量存在任何潜在危险+;在节目中询问他们的地址

C++ 在C+的头文件中使用常量存在任何潜在危险+;在节目中询问他们的地址,c++,storage,constants,linkage,C++,Storage,Constants,Linkage,我在头文件中定义常量,并将其包含在项目的源文件中。C++编译器通常不为这些常量创建存储,并将它们的链接保持为内部。如果我询问程序中任何常量的地址,编译器将被迫为该常量变量创建一个存储器。我的问题是,如果编译器正在为常量变量创建存储,那么变量的链接也会受到影响吗?因为如果链接是外部的,编译时会出现链接错误。当我将指针指向包含的头文件的常量(需要常量的地址)时,我的测试程序不会给出任何链接错误。如果有人能简要解释C++中存储和链接的概念,或者指导我在某个地方找到一些好的解释,我将不胜感激。提前谢谢

我在头文件中定义常量,并将其包含在项目的源文件中。C++编译器通常不为这些常量创建存储,并将它们的链接保持为内部。如果我询问程序中任何常量的地址,编译器将被迫为该常量变量创建一个存储器。我的问题是,如果编译器正在为常量变量创建存储,那么变量的链接也会受到影响吗?因为如果链接是外部的,编译时会出现链接错误。当我将指针指向包含的头文件的常量(需要常量的地址)时,我的测试程序不会给出任何链接错误。如果有人能简要解释C++中存储和链接的概念,或者指导我在某个地方找到一些好的解释,我将不胜感激。提前谢谢

//in constants.h
const double UNIT_LENGTH = 1e-10;
//in constants.cpp
#include "constants.h"
const double * temp = &UNIT_LENGTH;
//in main
#include "constants.h"
double A = UNIT_LENGTH;  //why there is no linking error

常量限定变量具有内部链接。在2012年标准中,3.5/3中的措辞为

如果名称空间范围(3.3.6)为[…]的名称,则该名称具有内部链接

  • 一种显式声明为const或constexpr的变量,既没有显式声明为extern,也没有先前声明为具有外部链接
“命名空间范围”包括全局命名空间


是否在头文件中声明它们无关紧要,但请注意,在每个翻译单元中,头文件将定义不同的对象。这通常无关紧要,因为它是常量,除非您想比较转换单元之间的地址。

常量限定变量具有内部链接。在2012年标准中,3.5/3中的措辞为

如果名称空间范围(3.3.6)为[…]的名称,则该名称具有内部链接

  • 一种显式声明为const或constexpr的变量,既没有显式声明为extern,也没有先前声明为具有外部链接
“命名空间范围”包括全局命名空间


是否在头文件中声明它们无关紧要,但请注意,在每个翻译单元中,头文件将定义不同的对象。这通常是不重要的,因为它是const,除非你想比较翻译单位的地址。

< p> C++中的全局const变量的链接(与c不同)被定义为总是内部的(又名静态)。所以你担心的问题不会发生

恰恰相反。如果你像对待普通的全局变量一样对待一个全局常数,你会导致


(但注意,如果是<代码> char */COD>变量,它们需要是 const char * const ,不只是<代码> const char */COD>。类似于其他指针,但字符最常用。

< P> C++中的全局const变量的链接(与C不同)被定义为始终是内部的(又名静态)。所以你担心的问题不会发生

恰恰相反。如果你像对待普通的全局变量一样对待一个全局常数,你会导致


(但请注意,如果这些是
char*
变量,它们需要是
const char*const
,而不仅仅是
const char*
。与其他指针类似,但最常用的是char。)

请提供一个简单的示例,说明您正在描述的实际代码。为什么要获取常量的地址?大多数处理器指令使用常量的值比使用地址然后取消引用地址更有效。请提供一个简单的示例,说明您所描述的实际代码。为什么要使用常量的地址?大多数处理器指令使用常量值更有效,而不是先获取地址,然后取消对地址的引用。谢谢你的回答。谢谢你的回答。