2011年12月28日水曜日

C言語新規格 "C1X"

C99から10年ぶりにC言語の規格が新しくなるようです




ドラフトはこちら

正直読む気になれない長さです。

さて、こちらのC1X - Wikiepdia[en]記事にC99からの変更点がまとめてあるので
こっちを読みましょう。

以下超訳。ツッコミ大歓迎
(というかあまりよくわかってないです)

Alignment specification (_Alignas specifier, alignof operator, aligned_alloc function, <stdalign.h> header file)
メモリの境界を指定したり確保したりする(アライメント関係の)関数がstdalign.hというヘッダーに纏められるようです

The _Noreturn function specifier
戻らない関数の修飾子 これはabort()みたいな帰ってこない関数の修飾子が出来たのでしょうか

Type-generic expressions using the _Generic keyword. For example, the following macro cbrt(x) translates to cbrtl(x), cbrt(x) or cbrtf(x) depending on the type of x:
#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
これはジェネリックですね。C++でいうとテンプレートかな?使い方は見ての通りですが、C++使えばいいじゃないかという気がしないでもない

Multithreading support (_Thread_local storage-class specifier,  header including thread creation/management functions, mutex, condition variable and thread-specific storage functionality, as well as the _Atomic type qualifier and for uninterruptible object access).
マルチスレッドのサポートを言語側でする模様

Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004 (char16_t and char32_t types for storing UTF-16/UTF-32 encoded data, including conversion functions in  and the corresponding u and U string literal prefixes, as well as the u8 prefix for UTF-8 encoded literals).
Unicodeのサポート。コレはありがたいですね。VisualStudioだとすでに<tchar.h>がありますが。

Removal of the gets function, deprecated in the current C language standard revision, ISO/IEC 9899:1999/Cor.3:2007(E), in favor of a new safe alternative, gets_s.
gets関数の代わりにgets_s関数が採用されるようです。これはMicrosoftの実装が採用された形になりますね

Bounds-checking interfaces (Annex K).
境界のチェック。 これは関数が配列を引数にするときの配列の境界をチェックするらしい。[参考]

Analyzability features (Annex L).
 直訳で解析性の機能。解析…というとデバッグとかの機能の追加?

More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store.
 浮動小数点に関するマクロ等の追加

Anonymous structures and unions, useful when unions and structures are nested, 
e.g. in
struct T { int tag; union { float x; int n; }; };
無名の構造体や共用体を構造体の中にネストさせて宣言することができるようになったようです。
VisualStudioではサポートしておりgccでも実装されているようです。(ただし非サポート。パラメータ指定で使用可)

Static assertions, which are evaluated during translation at a later phase than #if and #error, when types are understood by the translator.
assert.hに記述されてるassertマクロと同等の働きをするコンパイル時アサートの追加。これはC++のboostライブラリにあるみたいですね。

An exclusive create-and-open mode ("…x") for fopen. This behaves like O_CREAT|O_EXCL in POSIX, which is commonly used for lock files.
ファイルオープンのモードの追加(…xモード) 。低水準関数のopen()でO_CREATE|O_EXCLを指定した時のように、fopen()でもファイルが存在しない時のみファイルを作成して開き、それ以外でエラーを返すモードが使えるようになったようです

The quick_exit function as a third way to terminate a program, intended to do at least minimal deinitializition if termination with exit fails.
 exit()に失敗したときにプログラムを終了する新しい方法として最小限の終了処理でプログラムを終了するquick_exit関数を追加[参考]

Macros for the construction of complex values (partly because real + imaginary*I might not yield the expected value if imaginary is infinite or NaN).
 複素数型の値の変数を作るときのためのマクロを追加。C++のコンストラクタみたいな使い方だと思われます。


色々追加されてますねー。ジェネリックとかは大きいと思います。ただ、マクロをたくさん追加しても周知されないと使われなさそうな気がします。C99にしても_Bool型や_Complex型といった機能が使われてるかどうか微妙ですし。
とりあえずは期待ですね。実装がどのくらい掛かるかはわかりませんが。