在 Cpp 标头中声明的常量变量应具有多少个符号条目

How many symbol entries should a constant variable that declared in Cpp header have?

本文关键字:多少 符号 变量 Cpp 声明 常量      更新时间:2023-10-16

这个程序是用c++编写的,用std++0x编译。

假设我在头文件中声明了一个常量:

/* const.h */
#ifndef CONST_H
#define CONST_H
const int length = 5;
#endif

我在我的 printer.h 和 monitor.h 文件中使用此 const.h。编译代码时,程序生成了 3 个翻译单元,即 main.o、printer.o 和 monitor.o。

编译输出如下:

g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.cpp"
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"monitor.d" -MT"monitor.o" -o "monitor.o" "../monitor.cpp"
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"printer.d" -MT"printer.o" -o "printer.o" "../printer.cpp"
g++  -o "constSym"  ./main.o ./monitor.o ./printer.o   

我的问题是该程序在最终可执行文件的符号表中应该有多少个"长度"的符号条目?我最初的想法是 3,因为我们有 3 个翻译单元,长度变量是内部链接的。因此,每个翻译单元应该有 1 个这样的条目,并且它们位于不同的地址。

但是,我尝试了一下,发现只有一个这样的符号。

请解释一下我的想法是错误的,为什么它只有一个符号。

你假设内部链接,每#include产生一个const变量的实例是不正确的;你得到的结果(一个符号(是正确的。

但是,如果您声明length为非常量,并且static,将为每个 TU 生成一个单独的符号,该符号#include s const.h

(这不是

您在生产中通常想要的东西,并且基于此变量的任何代码(函数(在 const.h 中定义都将违反一个定义规则,因为它将引用包含它的每个 TU 中的不同符号。

另请注意,将length声明为 const 会使其隐式static