「C言語/記法」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
cite
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
137 行
 
=== 識別子 ===
識別子とは、オブジェクト<ref>ここで言うオブジェクトは、§3.15 1 ''object'' で定義された「オブジェクトは、実行環境にあるデーターの保存領域で、その内容は値を表すことができる。」と変数のこと。</ref>、関数、構造体・共用体・列挙体のタグまたはメンバー、typedef名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表します<ref name="jtc1-sc22-wg14-n2596-6.2.1">{{cite book
識別子とは、1つ又はそれ以上の実体を指し示すもので、<ref name="jtc1-sc22-wg14-n2596-6.4.2">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/c17_updated_proposed_fdis.pdf
| archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
| archivedate = 2018-12-30
| title = N2176 C17 ballot ISO/IEC 9899:2017
| page = 35, §6.2.1 ''Scopes of identifiers''
| publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。
同じ識別子でも、プログラム中の異なる時点では異なる実体を表すことがあります<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
列挙型のメンバーは列挙定数と呼ばれます<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
マクロ名とマクロ仮引数パラメータについては、ここでは説明しません。プログラム翻訳の意味論的な段階の前に、ソースファイル内でマクロ名が出現すると、それは マクロ定義を構成する前処理のトークンシーケンスに置き換えられるからです<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
 
識別子とは、1つ以上のエンティティを指定する非桁の文字(アンダースコア_、小文字と大文字のラテン文字、その他の文字を含む)と数字のシーケンスです。小文字と大文字は区別されます<ref name="jtc1-sc22-wg14-n2596-6.4.2">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/c17_updated_proposed_fdis.pdf
| archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
143 ⟶ 154行目:
| title = N2176 C17 ballot ISO/IEC 9899:2017
| page = 43, §6.4.2 ''Identifiers''
| publisher = ISO/IEC JTC1/SC22/WG14}}</ref>
識別子の最大長には特に制限はありません<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
オブジェクト、関数、構造体・共用体・列挙体のタグまたはメンバ、型定義名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表します<ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref>。
識別子に含まれる各汎用文字名は、ISO/IEC 10646(UCS)における符号化がD.1.71に規定された範囲のいずれかに該当する文字を指定しなければならない)<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
初期文字は、符号化がD.2に規定された範囲のいずれかに該当する文字を指定する汎用文字名であってはならない<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
実装では、基本ソース文字セットに含まれないマルチバイト文字を識別子に使用することができる<ref name="jtc1-sc22-wg14-n2596-6.2.1"/>。
 
==== 予約済み識別子 ====
ISO/IEC 9899:2011(通称 C11)の §7.1.3 Reserved identifiers を抄訳/引用します。
<blockquote class="toccolours" cite="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf">
各ヘッダーは、関連する(仕様書の)小節に記載されているすべての識別子を宣言または定義し、オプションとして、関連する将来のライブラリの方向性の小節に記載されている識別子や、任意の用途またはファイルスコープの識別子として常に予約されている識別子を宣言または定義します<ref name="jtc1-sc22-wg14-n1570-7.1.3">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=182, §7.1.3 ''Reserved identifiers''
| publisher = ISO/IEC}}</ref>
* アンダースコアと大文字または別のアンダースコアで始まるすべての識別子は、どのような用途でも常に予約されています。
* アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方で、ファイルスコープを持つ識別子として常に予約されています。
* (将来のライブラリポリシーを含む。)7.1.1項で指定された各マクロ名は、本規格で明示的に異なる規定がない限り、それに関連するヘッダーが組み込まれている場合、指定された用途のために予約されるものとする(7.1.4項参照)。
* (将来のライブラリポリシーを含む)。7.1.1項で規定されている外部結合を持つ識別子はすべて、常に外部結合を持つ識別子として使用するために予約されています。
* (将来のライブラリポリシーを含む)7.2.1項に規定されたファイル有効範囲を持つ各識別子は、マクロ名として、また関連するヘッダーが組み込まれている場合は同じ名前空間のファイル有効範囲を持つ識別子として使用するために予約されています。別子として使用するために予約されています。
 
その他の識別子は予約されていません。7.1.4項で許可されている場合を除き、予約されている文脈で識別子を宣言・定義した場合や、予約されている識別子をマクロ名として定義した場合、その動作は未定義です。
 
プログラムが、上記の第1グループの識別子のマクロ定義を(#undefで)削除した場合、その動作は未定義である。
</blockquote>
この定義から、以下は予約済み識別子です。
;_NAME
:アンダースコアとで始まる識別子
;bool:ヘッダー <stdbool.h> で定義されたマクロ。
;printf:ヘッダー <stdio.h> で定義された外部結合を持つ識別子。
 
識別子は、半角英数、「_(下線)」からなる文字列である。
ただし、先頭は非数字でなければなりません。
識別子に多バイト文字を使用できるかは言語処理系による<ref name="jtc1-sc22-wg14-n2596-6.4.2"/>。
 
==== __func__ ====