在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,也未声明为具有外部链接

"命名空间范围"包括全局命名空间。

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

C++中全局常量变量的链接(与 C 不同(被定义为始终是内部的(也称为静态的(。所以你担心的问题不会发生。

恰恰相反。如果像对待普通全局变量一样对待全局常量,则会导致链接器错误。

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

最新更新