なぜCでauto a=1;がコンパイルされるのでしょうか? 質問する

なぜCでauto a=1;がコンパイルされるのでしょうか? 質問する

コード:

int main(void)
{
    auto a=1;
    return 0;
}

ファイルに.c拡張子が付いている場合、MS Visual Studio 2012コンパイラによってエラーなしでコンパイルされます。私は、.c拡張子を使用する場合、コンパイルはC++ではなくC構文に従って行われるべきだと常に考えていました。さらに、私が知る限り、型なしのautoは許可されています。のみC++11 以降の C++ では、型が初期化子から推測されることを意味します。

これは、コンパイラが C に準拠していないということでしょうか、それともコードは実際に C 言語で正しいのでしょうか?

ベストアンサー1

autoは「ローカル スコープ」を意味する古い C キーワードです。auto aは と同じです。また、関数内で宣言された変数のデフォルトはローカル スコープであるため、この例とauto int a同じです。int a

このキーワードは、実際にはCの前身であるBの名残です。Bでは基本型がありませんでした。すべてはint、、へのポインタint、配列でした。(*) 宣言は、または[sic]intのいずれかになります。Cは「すべてが」というデフォルトのルールを継承しているため、次のように整数を宣言できます。autoextrnint

auto a;
extern b;
static c;

ISO Cではこれを廃止しましたが、多くのコンパイラは下位互換性のためにこれをまだ受け入れています。なじみがないように思われる場合は、関連する規則が次のコードで機能していることを認識してください。

unsigned d;  // actually unsigned int

これは現代のコードでもまだ一般的です。

C++11 では、C++ プログラマーが本来の意味で使用していなかったキーワード を、その型推論に再利用しました。これは、intC の「すべてが 」というルールが C++98 ですでに廃止されていたため、ほぼ安全です。唯一問題となるのは ですがauto T a、これは誰も使用していませんでした。(彼のどこかで言語の歴史に関する論文Stroustrup 氏はこれについてコメントしていますが、現時点では正確な出典を見つけることができません。

(*) Bの文字列処理は興味深いものでした。配列を使用しint、各メンバーに複数の文字を詰め込むのです。Bは実際にはBCPL構文が異なります。

おすすめ記事