C/C++ 用語集

この用語集はコラム「Deep C++」(http://msdn.microsoft.com/voices/deep.asp)の関連記事です。

ANSI

American National Standards Institute(米国規格協会。http://www.ansi.org/)技術委員会で、かつては X3 J11 という名前でしたが、今では単に J11(http://www.x3.org/ncits/tc_home/j11.htm)と呼ばれており、アメリカ合衆国における C プログラミング言語標準規格の作成と保守の責任を担っています。同様の委員会、J16(http://www.x3.org/ncits/tc_home/j16.htm)は、合衆国における付随的な C++ 標準規格を担当しており、どちらの委員会も対応する ISO 委員会でアメリカを代表する委員会です。

ANSI C

ANSI の 1989 C 規格で規定された C 言語で、K&R の C 言語に由来します。採用された年にちなんで C89 としても知られています。

ANSI C 規格

正式な文書名は「ANSI X3.159-1989」。ANSI が 1989 年に発行した合衆国 C 言語標準規格は、技術的には翌年に発行され、ANCI C の後継となった ISO の言語 C 規格と同じ。

The ARM

Margaret Ellis、Bjarne Stroustrup 共著『The Annotated C++ Reference Manual』の頭字語。初版 1991 年。The ARM と標準C++言語 の関係は、K&R による本と標準 C 言語の関係と同等です。当時の事実上の標準であり、最終的に ISO 標準となった基礎仕様です。

引数の推測

明示的な関数テンプレートの引数(<...>)を必ず必要とするという方法の代わりに、コンパイラは関数呼び出しの内容からテンプレートの引数を推測することができます。その場合、コンパイラは、呼び出し関数の引数の型を、候補となる関数テンプレートのパラメータのパターン(およびそれらを明示的に特殊化したもの)と照合します。完全に一致するものが 1 つだけある場合、関数は暗黙のうちにインスタンス化されます。

引数の推測を使うことによって、テンプレート関数呼び出しを非テンプレート関数呼び出しに見せかけることが可能です。ただし、引数の推測のアルゴリズムは複雑であり、コンパイラが必ずしも最も適切な一致を推測するとは限りません。逆に言えば、テンプレート引数からパラメータへの変換の規則は、ほかの C++の変換規則とは異なるため、コンパイラが期待とは異なる一致を見つける場合があります。

自動記憶領域、自動オブジェクト

C または C++ の auto または register と明示的に宣言されたか、あるいは extern または static と明示的に宣言されなかったローカル スコープ オブジェクトは、自動記憶領域を持ちます。そのような記憶領域を持つオブジェクトは自動オブジェクトです。自動オブジェクトの記憶領域は、それらが作成されたブロックが終了するまで保持されます。自動オブジェクトは、大部分のプログラマが「ローカル変数」または「スタック変数」だと考えるものです。

CV 修飾子

標準規格の中で使用される constvolatile の 2 つの種類の型修飾子を表す言葉。

D&E

Bjarne Stroustrup 著『The Design and Evolution of C++』の頭字語。初版 1994 年。C と C9x 標準規格には対応する Rationale(論理的根拠)文書がありますが、C++ の標準規格にはこうした文書がありません。その代わり、D&E が標準C++ の事実上の Rationale として機能します。

宣言子

簡略定義:C または C++ の宣言の「右側」

厳密な定義:C または C++ の宣言における単一のオブジェクトの名前、関数、typedef、および関連する下記の修飾子

  • *&

  • cv 修飾子(constvolatile

  • 名前指定子(std:: など)

  • () 内の関数パラメータ

  • [] 内の配列の長さ

  • 例外処理の指定

  • イニシャライザ

使用例:

&a[N]

* const p = 0

X::f(int) throw()

宣言子はとても重要です(標準 C++ の第 8 節全部を使って解説されています)。

宣言指定子(宣言の「左側」)と宣言子の組み合わせは、C と C++ 言語において最も入り組んでいてエラーの起こりやすい文法です。コンパイル時に原因の分かりにくい宣言子エラーが発生すると、ベテラン プログラマでも、何とかエラーが魔法のようになくなることを願って、*() など構文上の項目を付け足してみます。

動的メモリ、動的に作成 / 動的に破棄されるオブジェクト

C++ オブジェクトは new 式によって動的に作成され、delete 式によって動的に破棄されます。そのようなオブジェクトは、動的記憶領域を持っています。これらの領域は、operator delete または operator delete[] によって解放されるまで保持されます。

EH

標準 C++ の例外処理の略称です。

完全に構築された

C++ オブジェクトは、そのコンストラクタが処理を完了しており、そのデストラクタが開始されていない場合にのみ、完全に構築された状態です。コンストラクタが例外をスローすると完全に構築された状態ではなくなります。

被包含サブオブジェクトは、それを包含しているコンストラクタの開始前に構築されるので、完全に構築されているという特性は再帰的です。クラス階層の深い部分にある 1 つのサブオブジェクトが例外をスローすると、それより上位の連鎖にあるネストしている包含オブジェクトは例外が処理されない限り、または処理されるまでは構築に失敗します。警告コンストラクタ(Caveat Constructor)。

ISO

International Organization for Standardization(国際標準化機構。http://www.iso.ch/)。多くの人が誤解しているのですが、ISO という名前は頭字語ではなく、「同等」を意味するギリシャ語「isos」から取ったものです(英語の接頭語「iso-」も同じ語が語源です)。

ISO 委員会 JTC1/SC22/WG14 および WG21(http://www.anubis.dkuug.dk/JTC1/SC22/WG21/)は、国際的な C(前者)および C++(後者)言語の標準規格を作成しています。ISO 委員会は、各国の標準化団体の代表で構成されており、アメリカ合衆国では、ANSI の J11 および J16 委員会が参加しています。

ISO C 標準規格(C 標準規格)

正式文書名は、「ISO/IEC 9899:1990」。対応する Rationale(論理的根拠)もあります。

この文書は、1990 年に ISO が発行した国際 C 言語標準規格です。技術的には ANSI C 標準規格と同じです。ただし、この 2 つの規格は、用語やセクション番号がわずかに異なります。

ISO は 1990 年から 3 回にわたって、次の補遺を付けて C 標準規格を更新してきました。

ISO/IEC 9899 AM1 (http://www.lysator.liu.se/c/na1.html). 1995 Amendment 1, adding international character support. Also known as Normative Addendum 1.

ISO/IEC 9899 TCOR1 (http://anubis.dkuug.dk/JTC1/SC22/WG14/www/docs/tc1.htm). 1995 Technical Corrigendum 1, correcting technical errors in the Standard.

ISO/IEC 9899 TCOR2 (http://anubis.dkuug.dk/JTC1/SC22/WG14/www/docs/tc2.htm). 1996 Technical Corrigendum 2, correcting a smaller number of additional technical errors.

C 標準規格は無料ではなく、ISO から購入することもできません。購入する際は、国内の ISO 加盟団体(http://www.iso.ch/addresse/membodies.html)または再販業者から購入してください。

ISO C9x 標準規格(委員会最終案)

正式文書名は「WG14/N843」。対応する Rationale(論理的根拠)(ftp://ftp.dmk.com/DMK/sc22wg14/rationale/c9x)もあります。

ISO の作業部会である JTC1/SC22/WG14 は、現在 C 標準規格全体の改訂を進めています。改訂された規格で規定されている C 言語は、俗に C9x と呼ばれています。この名前が示すとおり、C9x の標準化は 1990 年代中に完了する予定です。

ISO C++ 規格(C++ 規格)

正式文書名は「ISO/IEC 14882:1998」。この文書は、ISO が 1998 年に発行した国際 C++ 言語規格です。

K&R

Brian Kernighan と Dennis Ritchie の本、『C Programming Language』第一版(http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0131103628)の略称。1978 年に出版された K&R は、約 10 年後に登場した ANSI C の基盤を形成しました。

K&R C

K&R で規定されている C 言語。K&R C には、標準 C で提供されているいくつかの主要な機能がありません。K&R C には関数プロトタイプ、constvolatile キーワード、void 型、列挙型、そして厳密に定義されたライブラリが含まれていません。

lvalue

文字通り「l の値」つまり「左辺値(left value)」のことです。K&R C では lvalue は代入文の左辺に現れるため、このように呼ばれます。標準 C と C++ では、lvalue はオブジェクトを指定する「ロケータ値(locator value)」と考えたほうがより正しいでしょう。

lvalue には変更可能なものと不可能なものがあり、前者は非 const オブジェクトに、後者は const オブジェクトにそれぞれ対応します。こうした名前はさておき、変更不可能な(const)lvalue は代入文の左辺には現れません(K&R C には const キーワードがないので、K&R の lvalue はすべて変更可能です)。

名前の装飾または合成

C++ で使われる名前を、C のリンカで識別可能な仮の名前にエンコードすること。名前を合成することで、C のリンカはクラス / 名前空間の適用範囲、および関数のオーバーロードをサポートできます。これは、そのままでは不正な再定義になるような名前を、別の一意の合成名に新しい定義を割り当てることで実現します。

C++ の言語規格では、C++ の名前からリンカが識別可能な名前へ変換する際の変換アルゴリズムを規定していません。そのため、独自の名前付け規則を自由に作成し、提供することが可能です。これは、オブジェクト ファイル間で異なる名前付け規則が混用できないということでもあります。

(また、引数を渡す方法、レジスタの割り当て、スタックの配置などの問題も混用できない理由になります。名前の合成は、ただでさえ状況の悪い相互運用製の問題をさらに悪化させるのです。)

部分的に構築された

C++ オブジェクトは、そのコンストラクタが実行を終了していない場合にのみ、部分的に構築されています。

RTTI

Run-Time Type Identification(実行時の型識別)の略。クラス オブジェクトが動的に、あるいは実行時に型の識別を行えるようにする標準 C++ の機構を表しています。RTTI は dynamic_casttypeid、および標準ライブラリ ヘッダー <typeinfo> でサポートされています。オブジェクトの実行時の型は、通常、そのオブジェクトの V テーブルからアクセス可能なデータとして保存されます。

rvalue

文字通り「r の値」つまり「右辺値(right value)」のことです。rvalue は代入文の右辺に現れるため、このように呼ばれます。オブジェクトを指定する lvalue とは異なり、rvalue は、少なくとも C では値だけを指定します。また C++ には構築済み(クラス)の型の無名一時オブジェクトを指定する「class rvalue」があります。こうしたオブジェクトは概念的にこの型の値です。

標準 C

ISO C 標準規格で指定されている C 言語。技術的には ANSI C と同じ。

標準 C++

ISO C++ 標準規格で指定されている C++ 言語。

標準テンプレート ライブラリ(STL)

C++ のクラスと関数のテンプレートの集まり。元々はヒューレット パッカード社の Stepanov 氏などにより作成され、後に改訂され C++ 標準ライブラリに組み込まれました。

STL は実際には次の 2 つに分けられます。

  • 厳密に定義された設計パターンのセット

  • これらのパターンの実装

設計パターンには次のようなものが含まれます。

  • オブジェクト コンテナ

  • コンテナ要素を操作するアルゴリズム

  • コンテナ要素にアクセスする反復子

  • コンテナのメモリを管理するアロケータ

  • コンテナとアルゴリズムに新しいインターフェイスを付与するアダプタ

C++ 標準ライブラリは、STL 設計パターンを遵守する多くのテンプレートを実装します。実際多くのプログラマは、このライブラリの実装を使って満足しています。しかし、設計パターンの規則に従う限り、標準ライブラリを使って複雑ながら予測可能な方法で相互運用できるコンテナやアルゴリズムなどを作成できます。

記憶クラス指定子

標準 C では以下のキーワードを指します。

  • auto

  • extern

  • register

  • static

標準 C++ では上記に加え、以下のキーワードを指します。

  • mutable

記憶クラス指定子は、その呼称のとおり、オブジェクトが占める記憶領域の種類、寿命、およびスコープを示します。例外は mutable で、これは実際には記憶領域を表すものではありません。しかし mutable は他の「真の」記憶クラス指定子とまったく同じ文法的コンテキストに登場するので、mutable を記憶クラス指定子とみなすほうが C++ の文法が簡単になります。

サブオブジェクト

他のオブジェクトに含まれている C++ オブジェクト。サブジェクトは、名前付きのデータ メンバー オブジェクト、名前のない基本クラス オブジェクト、または配列要素です。

*反意語:*完全オブジェクト

型修飾子

CV 修飾子である const および volatile に加えて、C9X では 3 つめの修飾子 restrict が追加されています。「CRV 修飾子」というような呼称は用いられず、C9X の規格では単にこれらを「型修飾子」と総称しています。