C1x は ISO/IEC 9899:2011 別名 C11 になりました。
2011 年 4 月のドラフト n1570から標準にどのような変更があるか (もしあれば) 知っている人はいますか?
ETA: ロンドン (2011 年 3 月) の委員会議事録 (n1570 に含まれる必要があります)はこちら、ワシントン DC (2011 年 10 月)の議事録はこちら; DC議事録で承認された変更のリストは、物事をカバーする必要があると思います.
今日、N1570 と最終的な C11 標準 (ISO/IEC 9899:2011 (E)) との間に 1 つの (やや) 重要な変更があることを知りました。
N1570 では、6.3.2p3 は次のように述べています。
sizeof
演算子、_Alignof
演算子、または単項演算子のオペランドである場合、または配列の初期化に使用される文字列リテラルである場合を除き、&
"型の配列" 型を持つ式は、"型へのポインター" 型を持つ式に変換されます。 " 配列オブジェクトの最初の要素を指し、左辺値ではありません。
unary-expressionの構文で許可されているため、の組み込みは_Alignof
エラーでした
_Alignof ( type-name )
だがしかし
_Alignof unary-expression
リリースされた C11 標準では、このエラーが修正され、C99 の文言に戻ります。
sizeof
演算子のオペランド、単項演算子、または配列の初期化に使用される文字列リテラルである場合を除いて、&
「型の配列」型を持つ式は、「型へのポインタ」型を持つ式に変換されます。配列オブジェクトの最初の要素であり、左辺値ではありません。
詳細情報: N1570 とリリースされた標準の違いに関する comp.std.c への最近の投稿で、ISO C 委員会のメンバーである Larry Jones は次のように書いています。
それらはいくつかありますが、ほとんどは編集上の微調整、ボイラープレート テキストの変更、およびパワーを満足させるためのシャッフルです。最大の変更点は、_Alignof が追加されるべきではない場所から _Alignof を削除したことです (実際には型のみを取るのに sizeof のように型または式のいずれかを取るという誤った考えに基づいています): 6.3.2.1p2、 p3、p4、fn。65; および 6.7.1 fn。121。
メッセージ ID:<rfg33a-u0q.ln1@jones.homeip.net>
groups.google.comで見られるスレッドは次のとおりです。
コメントでJens Gustedtが回答しました:
comp.std.c に関する Larry Jones のコメントによると、N1569 (変更マーカーのない N1570) からの大きな変更はありませんでした。未解決のまま残っているのは の値だけですが、
__STDC_VERSION__
最も自然に になると思います201112L
。
ISO は、C プログラミング言語の新しい C11 (C1x) 標準を ISO/IEC 9899:2011 として批准し、発行しました。C11 ウィキペディアの記事に記載されているように、以前の標準 (C99) からの主な変更点は次のとおりです。
この標準には、C99 言語およびライブラリ仕様に対するいくつかの変更が含まれています。
- アライメント指定 (
_Alignas
指定子、_Alignof
演算子、aligned_alloc
関数、<stdalign.h>
ヘッダー ファイル)_Noreturn
関数指定子
_Generic
キーワードを使用した型ジェネリック式。たとえば、次のマクロは、のタイプに応じて、またはにcbrt(x)
変換されます。cbrtl(x)
cbrt(x)
cbrtf(x)
x
#define cbrt(X) _Generic((X), long double: cbrtl, \ default: cbrt, \ float: cbrtf)(X)
- マルチスレッドのサポート (
_Thread_local
ストレージ クラス指定子、<threads.h>
スレッドの作成/管理関数を含むヘッダー、ミューテックス、条件変数、スレッド固有のストレージ機能、_Atomic
型修飾子、<stdatomic.h>
割り込み不可能なオブジェクト アクセス用)。- C Unicode Technical Report ISO/IEC TR 19769 :2004 (
char16_t
およびchar32_t
UTF-16/UTF-32 でエンコードされたデータを格納するための型に基づく<uchar.h>
改善された Unicode サポート。 UTF-8 でエンコードされたリテラル)。u
U
u8
gets
以前の C 言語標準リビジョン ISO/IEC 9899:1999/Cor.3:2007(E) で廃止された関数の削除。新しい安全な代替手段gets_s
.- 境界チェック インターフェース (附属書 K)。
- 分析機能 (付録 L)。
- 非正規浮動小数点数と型が格納できる 10 進数の桁数に関して、浮動小数点型の特性を照会するためのマクロが追加されました。
- 匿名の構造体と共用体。たとえば で共用体と構造体がネストされている場合に便利です
struct T { int tag; union { float x; int n; }; };
。#if
およびより後の段階で#error
、翻訳者が型を理解するときに評価される静的アサーション。- の排他的な作成して開くモード (
"…x"
サフィックス)fopen
。O_CREAT|O_EXCL
これは、一般にロック ファイルに使用される POSIX のように動作します。- プログラムを終了するための 3 番目の方法としての関数。終了が失敗した
quick_exit
場合に、少なくとも最小限の初期化解除を行うことを目的としています。exit
- 複雑な値を構築するためのマクロ (が無限または NaN
real + imaginary*I
の場合、期待値が得られない可能性があるため)。imaginary
ISO サイトから、公開されている完全な規格を購入できます。ISO サイトから抜粋した要約を次に示します。
ISO/IEC 9899:2011 は、C プログラミング言語で記述されたプログラムの形式を指定し、解釈を確立します。指定する
- C プログラムの表現。
- C 言語の構文と制約。
- C プログラムを解釈するためのセマンティック規則。
- C プログラムによって処理される入力データの表現。
- C プログラムによって生成される出力データの表現。
- 適合する C の実装によって課せられる制約と制限。
ISO/IEC 9899:2011 では規定されていません
- データ処理システムで使用するために C プログラムを変換するメカニズム。
- データ処理システムで使用するために C プログラムを呼び出すメカニズム。
- C プログラムで使用するために入力データを変換するメカニズム。
- C プログラムによって生成された後に出力データが変換されるメカニズム。
- 特定のデータ処理システムの容量または特定のプロセッサの容量を超えるプログラムおよびそのデータのサイズまたは複雑さ。
- 適合する実装をサポートできるデータ処理システムのすべての最小要件。ISO/IEC 9899:2011 は、さまざまなデータ処理システム間での C プログラムの移植性を促進するように設計されています。これは、実装者およびプログラマーによる使用を目的としています。