blog

なぜ "auto a = 1; "はC言語でコンパイルできるのか?

autoは「ローカルスコープ」を表す古いCのキーワードです。 auto a` は `auto int a` と等価で、関数内の変数の定義はデフォルトではローカルスコープの変数なので、この例では `in...

Apr 24, 2025 · 2 min. read
シェア

質問です:

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

上記のようなコードを拡張子.cのファイル内に記述しても、MS Visual Studio 2012のコンパイラでコンパイルしてもエラーは報告されません。拡張子を.cにすると、コンパイラーはC++ではなくCの構文に従うと思っていました。また、私の知る限り、定義された型を示さないauto変数宣言は、C++11標準以降にのみ許可されています。autoとは、変数の型が初期化メソッドによって推測できることを宣言することです。

***解答

auto は `ローカルスコープ` を表す古い C のキーワードです。 auto a` は `auto int a` と等価で、関数内の変数の定義はデフォルトではローカルスコープなので、この例では `int a` とも等価です。

このキーワードは実はC言語の前身であるB言語の遺産で、B言語には基本的な型がありませんでした。 これらの型は `auto` または `extern` としてのみ宣言することができます。 Cはデフォルトとして「どの型もintである」ことを継承しているので、整数を次のように宣言することができます:

auto a;  
extern b;  
static c; 

ISO C標準はこの規則を廃止していますが、もちろん後方互換性のためにこれを受け入れるコンパイラもあります。それでもまだ奇妙に思われるのであれば、次の文でも同様の規則が有効であることを知っておいてください:

unsigned d; // actually unsigned int 

上式のコードは、現代のコードでは一般的なものです。

C++11 では、このキーワードの本来の意味が C++ プログラマによって使用されることはほとんどなかったため、型派生に再利用されています。 C++98 標準では、「すべてが int である」という C の法則が廃止されたため、このキーワードは一般的に安全です。()

B言語での文字列処理は興味深いもので、int配列を使用し、int配列の各メンバーで複数の文字をラップします。

Read next

Linux 3.15では、ハングとリカバリの時間が動的に短縮される

2014年半ばにリリースが予定されているLinux 3.15カーネルでは、ACPIと電源管理のアップデートが多数行われる予定です。一方、Linuxカーネルの最新の安定バージョンは3.13.6です。Linuxの創始者であるリーナス・トーバルズは、次期3.14のバージョン6リリース候補を正式に発表しました。

Apr 23, 2025 · 1 min read