このコード行が間違っていましたが、有効かどうかは不明でした。それは何をするためのものか?変数にはどのような型がありますか?このCコード行は何をしますか? (const VAR = "string";)
const VARNAME = "String of text";
このコード行が間違っていましたが、有効かどうかは不明でした。それは何をするためのものか?変数にはどのような型がありますか?このCコード行は何をしますか? (const VAR = "string";)
const VARNAME = "String of text";
奇妙なことに、私はこれをコンパイルするとは思っていませんでしたが、それはありません。しかし、コンパイラはあまりそれを好きではない:
..\main.c:4:7: warning: type defaults to 'int' in declaration of 'VARNAME'
..\main.c:4:17: warning: initialization makes integer from pointer without a cast
だから、デフォルトタイプとしてint型を取るんし、文字列は後でとしてキャストすることができポインタ(であるため、このようVARNAMEは、ポインタ値を持っていますchar *)。
これは(インテルIA32マシン上で)完璧に動作します:
#include<stdio.h>
const VARNAME = "String of text";
int main()
{
printf("%s\n", (char*)VARNAME);
return 0;
}
しかし、私は個人的に、このような暗黙の型を使用することはありません。以下のコメントで説明したように:
はsizeof(intは)より小さい はsizeof(char型*)であるかもしれないので、それも危険だ
は
あなたの環境ではyesですが、私は 'VARNAME'がOPのコードで定義されていると信じています。 – moose
'sizeof(int)'が 'sizeof(char *)'よりも小さいかもしれないので危険です。 –
これはあなたの箱ではうまくいくかもしれませんが、ポインタを 'int'に格納するのは実装定義の振る舞いです。 –
「VARNAME」の定義が見つかります。私は "char *"のようなものを言うでしょう。
GCCが何しようとするどのようなものです:
int
で定数VARNAME
を作成します。int
にすると、文字定数へのポインタが含まれます。おそらくint
が32ビットでポインタが64ビットなので、私のマシンではコンパイルされません。
a.c:1: error: initializer element is not computable at load time
ホープこの[リンク1](http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html)、[リンク2](http://www.tutorialspoint.com/ansi_c/c_using_constants .htm)はあなたを助けます... –
ちょうど好奇心から、あなたはこの小さな憎悪にどこで遭遇しましたか? –