2013-07-13 13 views
12

CとC++で次のようなステートメントを許可する主な理由は何ですか?const typedef; CとC++で

const typedef; 

実用的ではないようです。

また、あなたはこれを行うことができます:const;typedef;

編集を:@AndreyTが指摘する、それが標準定義された動作ではありません。完全な答えについては、GCCの開発者の前で、この種のコードをコンパイル可能と判断したときに起こった可能性のある利点について知りたいと思います。

+11

私がLinus Torvaldsの場合、「Cでは、その唯一の目的はC++プログラマを守ることです。 –

答えて

11

これは縮退した宣言のようです。

In C宣言はステートメントではありません。それは宣言です。あなたが上にあるものは許可されていません。

6.7宣言

2宣言は、 タグ、またはメンバー(関数の パラメータまたは構造体または共用体のメンバー以外)の少なくとも宣言を宣言しなければなりません列挙型。

C++宣言はステートメントです。しかし、あなたは上記のことは許されません。 C++ 03

から

7宣言

3クラス(項9)または列挙(7.2を宣言する場合、単純な宣言は、オプションのinit-宣言リストは のみを省略することができます)、 です。すなわち、decl-specifier-seqに クラス指定子、クラスキー(9.1)、 またはenum指定子を持つ精巧な型指定子が含まれています。

CまたはC++コードでこれを許可するコンパイラがある場合、そのコンパイラのクルークでなければなりません。その質問を著者に伝えるべきです。

ご存じのように、CとC++の構文は、文法だけでは指定されていません。文法だけでそれを行うことは、あまりにも複雑すぎるか、まったく不可能です。文法に付随するテキストには、いくつかの追加の制限が課されています。コンパイラは通常、文法そのものを尊重して扱いますが、複雑な追加の制限について言えば、多くのコンパイラはいくつかの違反行為を許しています。

私は、これが "空の宣言"拡張の副作用でなければならないと推測します。時代の初めから、空の宣言はCおよびC++では不正です。それは空の宣言と関数定義を以下のため、例えば、このコードは常に違法

void foo() {}; // In file scope 

てきました。しかし、事実上すべてのコンパイラがそれを受け入れ、空の宣言を拡張として認めています。あなたと同じ理由で、ファイルの途中に

;;;; // In file scope 

と書いてコードをコンパイルすることができます。あなたの例では、空の宣言もあります。この宣言には、重要ではない修飾子と記憶クラス指定子が追加されています。

P.S.私が間違っていれば私を訂正しますが、C++ 11は空の宣言を合法化しました。私はC11については分かりません。

+3

サイドノートでは、 'gcc'と' clang'の両方が '-Wall -ansi -std = c89 -pedantic'でこれを許可するように見えます(警告を出すだけです)。 –

+0

gccの拡張子なしのC++ 11モードでも動作します –

+0

@ sasha.sochka:用語には注意してください! Empty * statement *は、CとC++では常に正当であった。 "古典的な" CとC++ではEmpty *宣言*が不正です。 – AnT