C99のforループはインラインでカウンタの変数を宣言できる

提供: C言語入門
2016年1月9日 (土) 15:55時点におけるDaemon (トーク | 投稿記録)による版 (ページの作成:「昔のC言語の仕様では、for文のカウント変数を forよりも前に宣言するのが一般的でした。C99では、その部分について改善さ...」)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

昔のC言語の仕様では、for文のカウント変数を forよりも前に宣言するのが一般的でした。C99では、その部分について改善されています。

読み方

C99
しー きゅうじゅう きゅう

概要

C言語では、forループを書く場合は、forで利用するカウンタ変数を事前に宣言するのが一般的でした。

uint32_t i;
for (i = 0; i < 10; ++i) {
	// doit
}

一方で、C++言語では、forの初期化パートで、変数を宣言できます。JavaもC++と同様です。

for (uint32_t i = 0; i < 10; ++i) {
	;
}

C99でも、仕様が変更され、どこでも変数が宣言可能になりました。 つまり、以下のコードで OK です。

for (uint32_t i = 0; i < 10; ++i) {
	;
}

ソースコード

/*
 * declare_counter_inline_for.c
 * Copyright (C) 2016 kaoru <kaoru@localhost>
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
int
main(int argc, char *argv[])
{
        for (uint32_t i = 0; i < 10; ++i) {
        }
        exit(EXIT_SUCCESS);
}

コンパイル

cc -std=c99 declare_counter_inline_for.c

失敗する例

-std=c99 を指定しない場合、以下のエラーになります。 gcc 4.6 でコンパイルするとこうなります。

$ gcc46 declare_counter_inline_for.c
declare_counter_inline_for.c: In function 'main':
declare_counter_inline_for.c:12:2:
    error: 'for' loop initial declarations are only allowed in C99 mode
declare_counter_inline_for.c:12:2:
    note: use option -std=c99 or -std=gnu99 to compile your code

gcc 4.9 の場合は、以下のようになります。

$ \gcc49 declare_counter_inline_for.c
declare_counter_inline_for.c: In function 'main':
declare_counter_inline_for.c:12:2:
    error: 'for' loop initial declarations are only allowed in C99 or C11 mode
  for (uint32_t i = 0; i < 10; ++i) {
  ^
declare_counter_inline_for.c:12:2:
    note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

新しいコンパイラの場合

ただし、新しいコンパイラだとデフォルトの挙動が変わっている影響で、エラーにならずに、コンパイルしてくれるコンパイラもあります。 gcc5 だと、std を指定しなくても、エラーになりません。

$ gcc5 declare_counter_inline_for.c
$

関連項目




スポンサーリンク