を実行する#define
と、コンパイラーではなく、プリプロセスされたソースファイル内のテキストSTRING0
を「string0」に置き換えてから、適切なコンパイラーに渡すプリプロセッサーがあります。
コンパイラは STRING0 を認識しませんが、STRING0 を記述したすべての場所で「string0」のみを認識します。
編集:
ソース ファイルに記述した STRING0 を置き換える "string0" の各インスタンスは、それ自体が文字列リテラルです。これらの文字列リテラルが不変であることが保証 (または宣言) されている場合、コンパイラは、この "string0" の単一のコピーを格納することでメモリ割り当てを最適化し、他の用途をそのコピーに向けることができます (編集でこの段落を言い換えました)。
(編集:これらの同一のリテラル文字列定数は、単一のコピーにマージされる可能性がありますが、これはコンパイラ次第です。標準はそれを要求または強制しません:http://www.velocityreviews.com/forums/t946521-merging- c-std.html によって保証された文字列リテラルの
最後の質問については、最も移植性が高いのは、次のように宣言することです。const char *
後で編集:これまでに見つけた文字列リテラルに関する最良の議論はここにあります: https://stackoverflow.com/a/2245983/1284631
また、静的配列の内容が上書きされる可能性があるため、文字列リテラルが他のコピーとマージできない場合、静的に割り当てられた char 配列の初期化にも使用できることに注意してください。以下の例を参照してください。2 つの同一の文字列リテラル "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