在 Cpp 标头中声明的常量变量应具有多少个符号条目
How many symbol entries should a constant variable that declared in Cpp header have?
这个程序是用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
。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 复制列表初始化的隐式转换的等级是多少
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- while循环中while循环的时间复杂度是多少
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- c++中无符号字符b[2]的初始值是多少
- 在 Cpp 标头中声明的常量变量应具有多少个符号条目
- 无符号长长的确切大小应该是多少
- 在32位Linux中,有符号的长-长数据类型的最大大小是多少
- LR(1) 语法的状态、符号和规则的数量的合理上限是多少?