2016-12-19 11 views
1

プログラムをコンパイルしようとしていますが(リスト12.13 - CのPrimer Plus 6th Editionからのmanydice.c)、コンパイルエラーが発生しています: 'status' undeclaredこの機能で使用してください)。コントロールセクション内のCで変数を宣言するときのコンパイル時エラー

「どこでも宣言する」というc99標準についての説明にも感謝します。ここ

は、コードの一部である:

int main(void) 
{ 
    int dice, roll; 
    int sides; 

    srand((unsigned int) time(0));  /* randomize seed  */ 
    printf("Enter the number of sides per die, 0 to stop.\n"); 
    while(scanf("%d", &sides) == 1 && sides > 0) 
    { 
     printf("How many dice?\n"); 
     if((status = scanf("%d", &dice)) != 1) 
     { 
      if(status == EOF) 
      { 
       break;     /* exit loop   */ 
      } 
      ... 

エラーメッセージがある:

||=== Build: Debug in dice (compiler: GNU GCC Compiler) ===| 
~manydice.c||In function 'main':| 
~manydice.c|19|error: 'status' undeclared (first use in this function)| 
~manydice.c|19|note: each undeclared identifier is reported only once for each function it appears in| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

オプション:(コードを使用::ブロックバージョンは、GCC 4.9.2を示す--gcc 16.01 MinGWの32ビット、Windows 7 Ultimate 32ビット)

mingw32-gcc.exe -Wall -g -std=c99 -c 

このエラーはなぜ発生しますか?

+2

あなたが使用している変数 'status'を*定義していない*ためです。 –

+1

あなたのコードには、 'status'を宣言しようとするようなものはありません。それはどこで宣言されたと思いましたか? –

+0

@ Wumpus Q. Wumbley私が学んでいるように、この本(この本と同じように入力したもの)からこの例を学んでいて、それがコンパイルされず、何が間違っているのかわからないので、この質問をします。 – spaceout

答えて

0

最初に、変数の宣言がCの「コントロールセクション」で許可されていると主張しています。その中には、明らかにifステートメントの条件が含まれています。あなたは間違っています。 C99から、宣言はforループの制御句の第1の表現の代わりに許可されているが、このようなif又はwhile文のような他のフロー制御構造における制御式の代わりにない

第2位では、「宣言」は「最初の出現」と同義ではありません。識別子の宣言は少なくともその情報に型情報を関連づけ、その配置は識別子の有効範囲を確立する。 がない場合、宣言 - あなたの場合のように - 識別子が使用されるスコープはありません。原始的なCは、それについてのより緩い規則を持っていましたが、あなたがC99に頼っているように見えるので、それらは無関係です。

ための最も簡単な宣言あなたの変数statusこの次のようになります、その変数の最初の使用の前に表示する必要があり、その範囲は、最も内側のブロックの最後まででしょう

int status; 

か任意のブロックの外に表示されている場合は、ファイルの末尾に移動します。あなたのケースでは、しかし、私はおそらくちょうど両方が statusを宣言し、あなたが使用しての初期値を算出すること

  int status = scanf("%d", &dice); 

     if (status != 1) 

 if((status = scanf("%d", &dice)) != 1) 

を置き換えます。私は同じ計算式で値の計算とテストを行うよりもはるかに明確です。

0

あなたの期待(または理解)が間違っています。

章の§6.8.4.1、C11を引用し、if文の構文は

if (expression)statement

あると、変数の宣言はないexpresssion声明です。

ただし、ステートメントの部分に変数を定義することはできます。

関連する問題