2012-03-01 14 views
2

私は、ANSI Cでこれを行うにしようとしていた。スコープの先頭にC89ローカル変数を宣言しますか?

include <stdio.h> 
int main() 
{ 
    printf("%d", 22); 
    int j = 0; 
    return 0; 
} 

これは(ANSI Cプロジェクトで)マイクロソフトVisual C++ 2010年には動作しません。あなたは、エラーを取得:

error C2143: syntax error : missing ';' before 'type' 

これは、作業を行います。

include <stdio.h> 
int main() 
{ 
    int j = 0; 
    printf("%d", 22); 
    return 0; 
} 

今、私はあなたが変数が内に存在するコードブロックの先頭で変数を宣言する必要があり、多くの場所で読んで、一般的に、このですANSI C89については真ですか?

人々がこのアドバイスを提供するフォーラムが多数見つかりましたが、GNU Cマニュアルのような「公式」ソースには書かれていませんでした。

答えて

3

ANSI C89では、スコープの先頭に変数を宣言する必要があります。これはC99でリラックスしています。

-pedanticフラグを使用すると、標準ルールをより厳密に適用する(これはデフォルトでC89モードになっているため)、これはgccでクリアされます。

これが有効なC89コードであることをしかし注意:

include <stdio.h> 
int main() 
{ 
    int i = 22; 
    printf("%d\n", i); 
    { 
     int j = 42; 
     printf("%d\n", j); 
    } 
    return 0; 
} 

しかし、スコープを示すために中括弧の使用(およびそのスコープ内の変数のため、寿命)が特に人気ではないようです、これC99 ...など

3

これはC89では絶対に当てはまります。コンパイラでは、コンパイラがサポートする言語とANSI Cの違いを文書化するだけです)

しかし、多くの "C89"コンパイラでは、コンパイラが厳密なモードに置かれていない限り、ブロック内のほぼどこにでも変数宣言を置くことができます。これには、-pedanticで厳密なモードにすることができるGCCが含まれます。 ClangのデフォルトはC99ターゲットになりますので、-pedanticは変数宣言とコードを混在させることができるかどうかには影響しません。

MSVCはC言語ではサポートが貧弱ですが、私は恐れています。いくつかの拡張子を持つC89(古い!)だけをサポートしています。

2

Now I read at many places that you have to declare variables in the beginning of the code block the variables exist in. Is this generally true for ANSI C 89?

はい、これはC89/C90標準で複合文の構文で必要とされています

(C90, 6.6.2 Compound statement, or block)

Syntax

compound-statement

{ declaration-list_opt statement-list_opt }

宣言はブロック内にステートメントの前にでなければなりません。

C99はブロック内で宣言とステートメントを混在させることでこれを緩和しました。 C99標準では:

(C99, 6.8.2 Compound statement)

Syntax

compound-statement:

{ block-item-list_opt }

block-item-list:

block-item

block-item-list block-item

block-item:

declaration

statement