「C99」の版間の差分
提供: C言語入門
(同じ利用者による、間の4版が非表示) | |||
行32: | 行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 == | ||
− | * [[ | + | * [[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言語で安全にコーディングしたり、より便利な機能が追加されています。
- 型の追加
- 変数宣言
- ローカル変数宣言がどこでもできる
- 配列の拡張
- 可変長配列
- 指示初期化子
- 配列
- 構造体
- プリプロセッサの改善
- C++スタイルのコメント(//)
- 関数名マクロ __func__
- インライン
- ライブラリの拡張
- stdio.h
- snprintfなどn系関数
- stdio.h
- 複合リテラル
コンパイル
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 では、従来まで不自由だった部分の改善が行われています。