如何在 GCC 中将重复或相乘的字符串文字合并为一个

how to merge duplicated or multiplicated string literals into one in GCC

我得到了多个字符串文字,例如

char* a1 = "apalaxia";
char* t = "apalaxia";
char* zzzz = "apalaxia";

跨几个编译单元/.o 文件

我强烈需要它们在一个运行时下合并 地址(因此所有这些都是一个 char* 值)

如何在 GCC 中执行此操作(在 C++ 模式下)?我试过 -fmerge-constants 和 -fmerge-all-constants 但 id 不合并

有什么问题

const char text[] = "apalaxia";
const char *t = text;
...

C 和 C++ 标准都不保证合并 字符串文字。如果您需要相同的地址,则无法使用单个 definition

请注意,如果指针可能指向非 const 以后,您必须声明它们 char *,但分配 const 指针可能会遇到麻烦。

-fmerge-constants 和-fmerge-all-constants 都不能保证字符串文字将被合并。两者都声明他们 "attempt to merge identical constants",但不保证他们会。

此外,C++ 标准的第 2.13.5 节指出 "Whether all string literals are distinct (that is, are stored in nonoverlapping objects) and whether successive evaluations of a string-literal yield the same or a different object is unspecified."

所以很遗憾,我认为如果不明确声明每个副本并将其导出到使用它的翻译单元,就无法获得有保证的单一位置。