「C99」の版間の差分

提供: C言語入門
移動: 案内検索
行110: 行110:
 
== C99 ==
 
== C99 ==
 
* [[C99のforループはインラインでカウンタの変数を宣言できる]]
 
* [[C99のforループはインラインでカウンタの変数を宣言できる]]
 +
* [[C99のインクルードガードはpragma once]]
 
== 関連項目 ==
 
== 関連項目 ==
 
{{iso}}
 
{{iso}}
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2016年1月9日 (土) 18:09時点における版

C99 とは、1999年に策定されたC言語の規格です。ANSI-C(C89)をより便利にしたものです。型の追加、ヘッダファイルの追加、文法の拡張、ライブラリの拡張など、いくつもの変更が施されています。現代では、C11という新しい規格も策定されています。

読み方

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

概要

C99は、C言語で安全にコーディングしたり、より便利な機能が追加されています。

  • 型の追加
    • stdbool.h, ブーリアン型 _Bool型(bool), true, false
    • stdint.h, intN_t,uintN_t
    • long long int
  • 変数宣言
    • ローカル変数宣言がどこでもできる
  • 配列の拡張
    • 可変長配列
  • 指示初期化子
    • 配列
    • 構造体
  • プリプロセッサの改善
    • C++スタイルのコメント(//)
    • 関数名マクロ __func__
  • インライン
  • ライブラリの拡張
    • stdio.h
      • snprintfなどn系関数
  • 複合リテラル

コンパイル

C99を有効にしてコンパイルするには、c99を指定します。

cc -std=c99 hoge.c

プロプロセッサの改善

関数名マクロ __func__

__func__ は、プログラムのデバッグやロギングの味方です。__func__ は、__func__ が書かれたブロックの属する関数名に置き換えられます。

*
 * __func__.c
 * Copyright (C) 2016 kaoru <kaoru@localhost>
 */
 
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
        (void) printf("%s\n", __func__);
        exit(EXIT_SUCCESS);
}

このコードは、関数 main を表示します。

$ cc __func__.c
$ ./a.out
main

デバッグやログのエラーの情報を吐き出すときに、一緒に、関数名を付け加えておくと、あとで調査が簡単になります。

変数宣言

変数宣言をどこでもできるようになった

従来までは、変数の宣言は、関数やブロックの先頭でないと宣言できませんでした。

{
	int i;
	int total = 0;
	int x;
 
	for (i = 0; i < 10; ++i) {
		total += i;
	}
 
	x = total;
}

C99では、ブロックの先頭部分に変数宣言をまとめる必要はなく、使いたい時に宣言できる、つまり、どこでも宣言できるようになりました。整数の変数 x は、先頭部分ではなく、関数の途中で宣言していますが、C99ならこれはエラーになりません。

{
	int i;
	int total = 0;
 
	for (i = 0; i < 10; ++i) {
		total += i;
	}
 
	int x = total;
}

C言語のforループでもカウンタ変数をインラインで宣言可能になった

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

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

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

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

詳細については、C99のforループはインラインでカウンタの変数を宣言できるをご参照ください。

まとめ

C99 では、従来まで不自由だった部分の改善が行われています。

C99

関連項目