在我的一个标题(C ++)文件中,我改变了
#define TIMEOUT 10
更多(?)C ++方式:
const int TIMEOUT = 10;
然而,似乎g ++(v 4.4.3)现在在二进制文件中多次包含此符号。
$ nm -C build/ipd/ipd |head
08050420 T ToUnixTime
08050470 T ParseTime
080504c0 T ParseISOTime
080518e4 r TIMEOUT
080518ec r TIMEOUT
080518f4 r TIMEOUT
080518fc r TIMEOUT
080503e0 T HandleMessage
怎么回事?
答案 0 :(得分:6)
您可能已将标题包含在四个单独的翻译单元(.cpp文件)中。
未声明为extern
的命名空间范围const变量隐含static
,因此每个包含标题的翻译单元都有一个。
答案 1 :(得分:3)
尝试使用enum
。这很像#define
,你不能参考它,并且保证不会在任何地方占用任何空间。
enum { TIMEOUT = 10 };
但如果它没有给你带来任何麻烦,我不会以某种方式担心。 const int
方式很好,我们谈论的是16个字节,给予或接受。
答案 2 :(得分:0)
编译器可能已经发现复制符号比引用符号更有效。这是由const
修饰符引起的。
在许多情况下,加载具有“立即”值的寄存器(存储在可执行文件中的值)比从使用间接寻址的ROM(只读存储器)中的位置加载更有效。
我不担心许多目标文件中的常量整数重复,除非它使文件太大而无法放在硬盘上。此外,目标文件是数据的临时存储,直到生成可执行文件。
我建议更多地关注应用程序的质量和健壮性,而不是目标文件的内部。