当您执行 时#define
,没有编译器,而是预处理器在将预处理源文件中的文本替换STRING0
为“string0” ,然后将其传递给适当的编译器。
编译器永远不会看到 STRING0,而只会在您编写 STRING0 的任何地方看到“string0”。
编辑:
替换您在源文件中编写的 STRING0 的每个“string0”实例本身就是一个字符串文字。如果这些字符串文字被保证(或声明)为不变,那么编译器可能会通过存储此“string0”的单个副本并将其他用途指向该副本来优化内存分配(我在编辑中改写了这一段)。
(编辑:那些相同的文字字符串常量可能会合并到一个单独的副本中,但这取决于编译器。标准不要求或强制执行它:http ://www.velocityreviews.com/forums/t946521-merging- of-string-literals-guaranteed-by-c-std.html )
至于你的最后一个问题:最便携的是将它们声明为:const char *
稍后编辑:到目前为止我发现的关于字符串文字的最佳讨论在这里:https ://stackoverflow.com/a/2245983/1284631
此外,请注意字符串文字也可能出现在静态分配的 char 数组的初始化中,当它不能与它的其他副本合并时,因为静态数组的内容可能会被覆盖。请参见下面的示例,其中两个相同的字符串文字“hello”无法合并:
#include <stdio.h>
#include <string.h>
int main(){
char x[50]="hello";
printf("x=%s, &x[0]=%p\n",x,&x[0]);
const char *y="hello";
printf("y=%s, &y[0]=%p\n",y,&y[0]);
strcpy(&x[0],"zz");
printf("x=%s, &x[0]=%p\n",x,&x[0]);
return 0;
}
这段代码的输出是:
x=hello, &x[0]=0x7fff8a964370
y=hello, &y[0]=0x400714
x=zz, &x[0]=0x7fff8a964370