2012-02-22 5 views
5

このコード行が間違っていましたが、有効かどうかは不明でした。それは何をするためのものか?変数にはどのような型がありますか?このCコード行は何をしますか? (const VAR = "string";)

const VARNAME = "String of text"; 
+0

ホープこの[リンク1](http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html)、[リンク2](http://www.tutorialspoint.com/ansi_c/c_using_constants .htm)はあなたを助けます... –

+2

ちょうど好奇心から、あなたはこの小さな憎悪にどこで遭遇しましたか? –

答えて

6

奇妙なことに、私はこれをコンパイルするとは思っていませんでしたが、それはありません。しかし、コンパイラはあまりそれを好きではない:

..\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型*)であるかもしれないので、それも危険だ

+0

あなたの環境ではyesですが、私は 'VARNAME'がOPのコードで定義されていると信じています。 – moose

+2

'sizeof(int)'が 'sizeof(char *)'よりも小さいかもしれないので危険です。 –

+0

これはあなたの箱ではうまくいくかもしれませんが、ポインタを 'int'に格納するのは実装定義の振る舞いです。 –

0

「VARNAME」の定義が見つかります。私は "char *"のようなものを言うでしょう。

2

GCCが何しようとするどのようなものです:

  1. デフォルトのタイプ、つまりintで定数VARNAMEを作成します。
  2. この定数をintにすると、文字定数へのポインタが含まれます。

おそらくintが32ビットでポインタが64ビットなので、私のマシンではコンパイルされません。

a.c:1: error: initializer element is not computable at load time 
関連する問題