WisdomSoft - for your serial experiences.

7.10 自動変数

変数宣言時に auto キーワードを用いて、対象の変数が宣言された複合文の範囲でのみ有効な自動変数であることを明示的に指定できます。しかし、宣言された変数は既定で自動変数であり、現代では auto 指定子を利用する意味はありません。

7.10.1 ローカルな寿命を持つ変数

C 言語の変数の宣言には、変数の寿命を明示的に指定する記憶クラスと呼ばれる種類の指定子を使うことができます。typedef は、実はこの記憶クラスの一種です。しかし typedef は比較的特殊な記憶クラスで、本来の記憶クラスは変数がどのタイミングでメモリから解放されるかなどを指定するものです。

記憶クラス指定子
記憶クラス指定子  変数名 ...

記憶クラス指定子は、同一の宣言内で異なる指定子を組み合わせて指定することはできません。

関数内など、複合文の内部で宣言された変数を自動変数と呼びます。自動変数は、そのブロック内でのみ有効な変数で、制御がブロックに入った時点で初期化され、ブロックから抜け出す時に解放されます。変数の有効範囲については「4.4 変数の有効範囲」で詳しく解説しています。記憶クラスは、そこで解説したように、変数を宣言する場所によって自動的に決定されます。複合文の内部で宣言された変数は、コンパイラが自動変数であると判断してくれます。

しかし、auto 指定子によって明示的に自動変数を宣言することも可能です。ただし、このキーワードを積極的に利用することにメリットはないため、通常は省略されます。現在では auto キーワードが本稿の意味で用いられることは滅多にありません。

auto 記憶クラス指定子
auto  変数名 ...

記憶クラスとして宣言時に auto を指定すれば変数が自動変数であることを明示的に指定することになります。

C++ の標準規格である ISO/IEC 14882:2011、通称 C++11 からは auto キーワードが型推論を表す別の意味で用いられるようになったため、auto 指定子を用いている C 言語のコードを C++ 言語としてコンパイルするとエラーになります。auto キーワードの意味が C 言語と C++ 言語で異なることに注意してください。

コード1
#include <stdio.h>

int main() {
	auto char *str = "Kitty on your lap";
	printf("%s\n" , str);
	return 0;
}
実行結果
コード1 実行結果

コード1の str 変数は auto 記憶クラス指定子を用いて明示的に自動変数であることを表して宣言されています。しかし、これまで学習してきたことを振り返ってわかるように、auto は省略しても何の問題もありません。そのため、これは省略されるべきです。C 言語の仕様で関数の中で宣言された変数は auto になるというのが原則なのです。