「C言語/前処理指令」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎事前定義済みマクロ定数: __func__ はマクロではなく、定義済識別子なのでマクロ定数の一覧からは削除。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎事前定義済みマクロ定数: C11をベースに加筆。
タグ: 2017年版ソースエディター
241 行
 
== 事前定義済みマクロ定数 ==
{{節スタブ}}
事前定義済みマクロ定数がある。
そのマクロ名と意味は次のようになっている。
 
|+ 事前定義済みマクロ定数一覧がある<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm N1653 Working draft changes for C99 preprocessor synchronization]</ref><ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#630 CWG Issue 630. Equality of narrow and wide character values in the basic character set]</ref><ref name="jtc1-sc22-wg14-n1570-6.10.8">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=175, §6.10.8 ''Predefined macro names''
| publisher = ISO/IEC}}</ref>。
 
以下のサブクラスに記載されている定義済みマクロの値は、翻訳単位全体で一定です(ただし、__FILE__ と __LINE__ を除く<ref>__LINE__ はともかく、__FILE__ は翻訳単位全体に一定では?との当然の疑問がありますが、#line でファイル名を指令された場合に変わりえます。</ref>)<ref name="jtc1-sc22-wg14-n1570-6.10.8" />。
 
これらのマクロ名および定義された識別子は、#define または #undef 前処理指令の対象になってはなりません。その他の定義済みマクロ名は、先頭にアンダースコアを置き、その後に大文字または2つ目のアンダースコアを置きます<ref name="jtc1-sc22-wg14-n1570-6.10.8" />。
 
実装では、マクロ __cplusplus を事前に定義してはならず、また、標準のヘッダーでも定義してはならない<ref name="jtc1-sc22-wg14-n1570-6.10.8" />。
 
=== 必須マクロ ===
以下のマクロ名は、実装によって定義されるものとする<ref name="jtc1-sc22-wg14-n1570-6.10.8.1">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=175, §6.10.8.1 ''Mandatory macros''
| publisher = ISO/IEC}}</ref>。
 
;__DATE__
: 前処理翻訳ユニットの翻訳日:"Mmm dd yyyy "形式の文字
: ここで、月の名前はasctime関数で生成されたものと同じであり、ddの最初の文字は、その値が10未満の場合はスペース文字である。
: 翻訳の日付が得られない場合は、実装で定義された有効な日付を供給しなければならない。
; __FILE__
: 現在のソースファイルの推定名(文字列リテラル)
; __LINE__
: 現在のソース行の(現在のソースファイル内の)推定行番号(整数定数)
; __STDC__
: 適合する実装であることを示すための整数定数 1。
; __STDC_HOSTED__
:; ホスト実装の場合
:: 整数定数 1
:; そうでない場合(=フリースタンディング実装である場合)
:: 整数定数 0
; __STDC_VERSION__
: 準拠する仕様に応じた整数定数
:; C90 : 未定義
:; C95 : 199409L
:; C99 : 199901L
:; C11 : 201112L
:; C17 : 201710L <!--C17は、ここぐらいしか変わってない-->
; __TIME__
: 前処理翻訳ユニットの翻訳時刻:文字列リテラル
: asctime関数で生成された時間と同様に、"hh:mm:ss" 形式の文字列リテラル。
: 翻訳時刻が得られない場合は、実装で定義された有効な時刻を提供する。
 
=== 環境マクロ ===
以下のマクロ名は、実装によって条件付きで定義されています<ref name="jtc1-sc22-wg14-n1570-6.10.8.2">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=176, §6.10.8.2 ''Environment macros''
| publisher = ISO/IEC}}</ref>。
 
; __STDC_ISO_10646__
; __STDC_MB_MIGHT_NEQ_WC__
; __STDC_UTF_16__
; __STDC_UTF_32__
 
=== 条件付き機能マクロ ===
以下のマクロ名は、実装によって条件付きで定義されます<ref name="jtc1-sc22-wg14-n1570-6.10.8.2">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=177, §6.10.8.3 ''Conditional feature macros''
| publisher = ISO/IEC}}</ref>。
 
; __STDC_ANALYZABLE__
; __STDC_IEC_559__
; __STDC_IEC_559_COMPLEX__
; __STDC_LIB_EXT1__
; __STDC_NO_ATOMICS__
; __STDC_NO_COMPLEX__
; __STDC_NO_THREADS__
; __STDC_NO_VLA__
__STDC_NO_COMPLEX__ を定義する実装は、 __STDC_IEC_559_COMPLEX__ を定義してはならない。
 
----
{|class="wikitable"
|+ 事前定義済みマクロ定数がある。一覧
|+ 事前定義済みマクロ定数一覧<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm N1653 Working draft changes for C99 preprocessor synchronization]</ref><ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#630 CWG Issue 630. Equality of narrow and wide character values in the basic character set]</ref>
!マクロ名!!意味
|-