该程序是用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个这样的条目,并且它们位于不同的地址。
然而,我试了一下,发现只有一个这样的符号。
请解释我的想法错误以及为什么它只有一个符号。
答案 0 :(得分:0)
您对内部链接的假设,每个const
产生一个#include
变量的实例是不正确的;你得到的结果(一个符号)是正确的。
如果您将length
声明为非常量,static
,则会为#include
s const.h
的每个TU生成单独的符号。
(这不是您在制作中通常需要的东西,const.h
中定义的任何基于此变量的代码(函数)都有可能违反One Definition Rule,因为它会将指每个包含它的TU中的不同符号。)
另请注意,将length
声明为const
会隐式static
。