2016-08-20 13 views
4

この:Cの中間ストリーム宣言にラベルを付けることはできませんか? C99中のSO

label: 
    int ret = function(of, stuff); 

はこの一方、コンパイル時にエラーを与える:

label: 
    ; 
    int ret = function(of, stuff); 

作品だけで罰金。

これはコンパイラのバグですか?あるいはこれはC標準の定義のバグですか?あるいは、これがC99規格の一部であれば、誰かがこれが完璧な意味であると主張するためにC標準を守るだろうか?

+2

「おそらく誰かがこれが完璧な意味であると主張するためにC標準を守るだろう」 - 確かに、あなたは正しい場所に来ています。 –

+0

なぜこれらのクローズ票?:-S - 私はまだよく覚えている公正な質問...:-) – alk

+0

プログラミング言語に関する質問は、プログラミングに関するものではないでしょうか? –

答えて

7

ラベルは、N1256で定義されています。ラベル付きステートメントは、ステートメントのみを含めることができます。

Syntax 
1  labeled-statement: 
      identifier : statement 
      case constant-expression : statement 
      default : statement 

int ret = function(of, stuff); N1256 6.7宣言で定義され、ステートメントではない宣言、です。

文をN1256 6.8文およびブロックで以下に定義される:

Syntax 
1  statement: 
      labeled-statement 
      compound-statement 
      expression-statement 
      selection-statement 
      iteration-statement 
      jump-statement 

compound-statementは0以上の宣言と{}に囲まれたステートメントである、ブロックいわゆるれます。

expression-statementは、N1256 6.5式で定義された0または1つの式で、その後にはi++;のようなセミコロンが続きます。構文内のは、N1256 6.5.17カンマ演算子で定義されています。

selection-statementは、ifおよびswitchである。

iteration-statementwhile,およびforである。

jump-statementgotocontinuebreakreturn文です。

宣言はステートメントではないため、宣言にラベルを付けることはできません。

+0

だから、あなたは、例えば、 'label:{int ret = function(of、stuff);} } '。 – detly

4

おそらく仕様のバグ - ブロック内でステートメントと宣言が混在するように変更されたとき(before宣言のすべての宣言を必要とするのではなく)、ステートメントと宣言を宣言、しかし、そうではありませんでした。時間の経過と共に言語がどのように進化したかの人工物。

宣言の前に空のステートメントにラベルを置くことで、簡単に回避することができます。

+0

おそらく、スイッチの末尾のケース(またはラベル)に対して、C99よりも前に同じナンキーと回避策があることに注意してください。私は、後続の文を必要とすると、あいまいさを解決するか、そうでなければパーサーにとってより簡単になると思います。 – doynax

+0

ステートメントに続く宣言を禁止する目的が、宣言の後のポイントから宣言の前のポイントにジャンプすることが実際には不可能であったことを保証する目的であれば、驚くことはありません。 *関数*内のすべての変数が実行可能コードの前にあることを要求すると(C89以前のコンパイルのように)、コード生成が単純化されますが、C89ルールは、コントロールをポイントに移すコード宣言は必ずしもその範囲を離れる必要があります。 – supercat

関連する問題