【发布时间】:2014-12-04 10:55:11
【问题描述】:
我想问一下跨翻译单元依赖字符串文字地址是否可移植?即:
给定文件foo.c 引用了字符串文字"I'm a literal!",是否正确且可移植地依赖其他给定文件(例如bar.c)相同的字符串文字 "I'm a literal!" 会有相同的内存地址?考虑到每个文件都会被翻译成一个单独的.o 文件。
为了更好的说明,下面是一个示例代码:
# File foo.c
/* ... */
const char * x = "I'm a literal!"
# File bar.c
/* ... */
const char * y = "I'm a literal!"
# File test.c
/* ... */
extern const char * x;
extern const char * y;
assert (x == y); //Is this assertion going to fail?
还有一个 gcc 示例命令行:
gcc -c -o foo.o -Wall foo.c
gcc -c -o bar.o -Wall bar.c
gcc -c -o test.o -Wall test.c
gcc -o test foo.o bar.o test.o
在同一个翻译单元中呢?如果字符串文字在 same 翻译单元中,这是否可靠?
【问题讨论】:
-
不,你不能依赖这个。
-
@NeilKirk 谢谢尼尔,我已经编辑并添加了第二个问题。它背后的任何理由都会有很大的启发。
-
@fanl - Visual C++ 编译器套件具有“字符串池”选项,其中相同的文字将具有相同的指针值。最后一句中的关键词是option。这意味着您不能相信指针值相等。
-
我想合理的是允许更快的编译。字符串池化是有代价的。
-
@Alnitak 字符串文字不是 const 字符串?
标签: c++ c string string-literals pooling