「C99」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「C99 とは、1999年に策定されたC言語の規格です。ANSI-C(C89)をより便利にしたものです。型の追加、ヘッダファイルの追加、文...」)
 
 
(同じ利用者による、間の5版が非表示)
行27: 行27:
 
*** snprintfなどn系関数
 
*** snprintfなどn系関数
 
* 複合リテラル
 
* 複合リテラル
 
 
== コンパイル ==
 
== コンパイル ==
 
[[C99]]を有効にしてコンパイルするには、c99を指定します。
 
[[C99]]を有効にしてコンパイルするには、c99を指定します。
行33: 行32:
 
cc -std=c99 hoge.c
 
cc -std=c99 hoge.c
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
== プロプロセッサの改善 ==
 +
=== 関数名マクロ __func__ ===
 +
__func__ は、プログラムのデバッグやロギングの味方です。__func__ は、__func__ が書かれたブロックの属する関数名に置き換えられます。
 +
<syntaxhighlight lang="c">
 +
*
 +
* __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);
 +
}
 +
</syntaxhighlight>
 +
 +
このコードは、関数 main を表示します。
 +
<syntaxhighlight lang="bash">
 +
$ cc __func__.c
 +
$ ./a.out
 +
main
 +
</syntaxhighlight>
 +
 +
デバッグやログのエラーの情報を吐き出すときに、一緒に、関数名を付け加えておくと、あとで調査が簡単になります。
 +
== 変数宣言 ==
 +
=== 変数宣言をどこでもできるようになった ===
 +
従来までは、変数の宣言は、関数やブロックの先頭でないと宣言できませんでした。
 +
<syntaxhighlight lang="c">
 +
{
 +
int i;
 +
int total = 0;
 +
int x;
 +
 +
for (i = 0; i < 10; ++i) {
 +
total += i;
 +
}
 +
 +
x = total;
 +
}
 +
</syntaxhighlight>
 +
 +
[[C99]]では、ブロックの先頭部分に変数宣言をまとめる必要はなく、使いたい時に宣言できる、つまり、どこでも宣言できるようになりました。整数の変数 x は、先頭部分ではなく、関数の途中で宣言していますが、[[C99]]ならこれはエラーになりません。
 +
<syntaxhighlight lang="c">
 +
{
 +
int i;
 +
int total = 0;
 +
 +
for (i = 0; i < 10; ++i) {
 +
total += i;
 +
}
 +
 +
int x = total;
 +
}
 +
</syntaxhighlight>
 +
=== C言語のforループでもカウンタ変数をインラインで宣言可能になった ===
 +
C言語では、forループを書く場合は、forで利用するカウンタ変数を事前に宣言するのが一般的でした。
 +
<syntaxhighlight lang="c">
 +
uint32_t i;
 +
for (i = 0; i < 10; ++i) {
 +
// doit
 +
}
 +
</syntaxhighlight>
 +
[[C99]]でも、仕様が変更され、どこでも変数が宣言可能になりました。
 +
つまり、以下のコードで OK です。
 +
<syntaxhighlight lang="c">
 +
for (uint32_t i = 0; i < 10; ++i) {
 +
;
 +
}
 +
</syntaxhighlight>
 +
 +
詳細については、[[C99のforループはインラインでカウンタの変数を宣言できる]]をご参照ください。
 +
== まとめ ==
 +
[[C99]] では、従来まで不自由だった部分の改善が行われています。
 +
== C99 ==
 +
* [[C99のforループはインラインでカウンタの変数を宣言できる]]
 
== 関連項目 ==
 
== 関連項目 ==
 
{{iso}}
 
{{iso}}
 +
* [[C言語のインクルードガードはpragma onceを使う]]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

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

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

関連項目