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

时间:2018-04-15 05:13:15

标签: c++ c++11

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

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

/* 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   

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

然而,我试了一下,发现只有一个这样的符号。

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

1 个答案:

答案 0 :(得分:0)

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

如果您将length声明为非常量,static,则会为#include s const.h的每个TU生成单独的符号。

(这不是您在制作中通常需要的东西,const.h中定义的任何基于此变量的代码(函数)都有可能违反One Definition Rule,因为它会将指每个包含它的TU中的不同符号。)

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