1. ホーム
  2. c

[解決済み] なぜC言語ではauto a=1;がコンパイルされるのですか?

2022-07-22 21:14:27

質問

コードです。

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

は、MS Visual Studio 2012 のコンパイラで、拡張子が .c のファイルをエラーなくコンパイルすることができます。私は常々、拡張子.cを使用する場合、コンパイルはC++ではなく、Cの構文に従うべきだと考えています。さらに、私の知る限り、型を指定しないautoは許可されています。 だけです。 で、それはイニシャライザーから型が推論されることを意味します。

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

どのように解決するのですか?

auto は古いC言語のキーワードで、ローカルスコープを意味します。 auto a と同じです。 auto int a と同じです。また、関数内で宣言された変数のデフォルトはローカルスコープなので、これも int a のようになります。

このキーワードは実はCの前身であるBの名残で、そこでは基本型が存在せず、すべてが int へのポインタです。 int の配列 int .(*) 宣言は以下のいずれかになります。 auto または extrn [sic]です。Cは、"すべてを継承しています。 int で整数を宣言することができました。

auto a;
extern b;
static c;

ISO C はこれを廃止しましたが、多くのコンパイラは後方互換性のためにまだこれを受け入れています。もしこれがなじみのないものだと感じたら、関連するルールが

unsigned d;  // actually unsigned int

というのは、現代のコードではまだ一般的です。

C++11 では、C++ プログラマがほとんど本来の意味で使っていなかったこのキーワードを、型推論に再利用しています。これは、"everything is のため、ほとんど安全です。 int という C のルールは C++98 ですでに削除されていたため、これはほぼ安全です。 auto T a だけで、これは誰も使っていませんでした。(彼の 言語の歴史に関する論文 のどこかで、Stroustrup はこのことについてコメントしていますが、今、正確な文献を見つけることができません)。

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