これは「いいえ」に対する回答であり、拡張コメントでもあります。これは、1999年以来、正当なCではありません。適切な最新のCコンパイラではこれを許可していません。
はい、auto a=1;
C1999(およびC2011)では違法です。これが違法になったからといって、最新のCコンパイラがそのような構造を含むコードを拒否する必要があるわけではありません。私はまさしくその反対を主張します、まともな現代のCコンパイラはまだこれを可能にする必要があります。
clangとgccはどちらも、問題のサンプルコードを1999または2011バージョンの標準に対してコンパイルするときにそれを行います。どちらのコンパイラーも診断を発行し、次に問題のあるステートメントがあったかのように続行しますauto int a=1;
。
私の意見では、これはまともなコンパイラーがすべきことです。診断を発行することにより、clangとgccは標準に完全に準拠しています。標準では、コンパイラが不正なコードを拒否する必要があるとは規定されていません。規格は、翻訳単位に構文規則または制約の違反が含まれている場合、適合実装は少なくとも1つの診断メッセージを生成する必要があると述べています(5.1.1.3)。
不正な構成を含むコードが与えられた場合、適切なコンパイラは不正なコードを理解しようと試み、コンパイラがコード内の次のエラーを見つけられるようにします。最初のエラーで停止するコンパイラは、あまり良いコンパイラではありません。から意味を理解する方法がありauto a=1
ます。これは、「暗黙のint」ルールを適用することです。このルールは、コンパイラーがC90またはK&Rモードで使用されauto a=1
ている場合と同じようにコンパイラーに解釈させるauto int a=1
。
ほとんどのコンパイラは通常、不正な構文を含むコードを拒否(拒否:オブジェクトファイルまたは実行可能ファイルの生成を拒否)します。これは、コンパイラの作者がコンパイルに失敗することが最善の選択肢ではないと決定したケースです。最善の方法は、診断を発行してコードを修正し、続行することです。のような構成で実行されているレガシーコードが多すぎregister a=1;
ます。コンパイラーは、そのコードをC99またはC11モードで(もちろん診断付きで)コンパイルできる必要があります。
int
1999年にC標準から削除されました