12

C および C++ で次のようなステートメントを許可する元の理由は何ですか?

const typedef;

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

また、これを行うことができます:const;そしてtypedef;

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

4

1 に答える 1

11

これは宣言の縮退形式のように見えます。

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

6.7 宣言

2 宣言は、少なくとも宣言子 (関数のパラメーターまたは構造体または共用体のメンバーを除く)、タグ、または列挙型のメンバーを宣言する必要があります。

C++ では、宣言はステートメントです。しかし、それでもあなたが上に持っているものは許可されていません。C++03 から

7 宣言

3 単純な宣言では、オプションの init-declarator-list は、クラス (節 9) または列挙 (7.2) を宣言する場合、つまり decl-specifier-seq にクラス指定子、クラスキー(9.1)または列挙型指定子を使用した精巧な型指定子。

一部のコンパイラが C または C++ コードでこれを許可している場合、それはそのコンパイラの癖に違いありません。その質問はその作者に向けるべきです。

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

これは「空の宣言」拡張機能の副作用であるに違いないと、知識に基づいて推測します。当初から、空の宣言は C および C++ では違法でした。たとえば、このコードは常に違法です

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

空の宣言を持つ関数定義に続くためです。ただし、事実上すべてのコンパイラがそれを受け入れ、空の宣言を拡張機能として許可していました。まったく同じ理由で、あなたが書くことができます

;;;; // In file scope

ファイルの途中で、コードをコンパイルします。例にあるのは空の宣言でもあり、重要でない修飾子とストレージクラス指定子をいくつか追加しました。

PS私が間違っている場合は修正してください。ただし、C++ 11は空の宣言を合法化しました。C11についてはわかりません。

于 2013-07-13T21:15:41.463 に答える