[C99] 第1回 C++にあってC99にない機能
今回は、C++にあってC99にない機能を採り上げます。といっても、細かい機能については次回以降の関連する記事で説明するとして、今回は比較的大きな機能に限って扱うことにします。
クラス
C++では、クラスキーが struct のクラスを「構造体」、クラスキーが union のクラスを「共用体」と呼びました。しかし、C99にはクラスという概念はありませんので、構造体や共用体はクラスではなく、別の概念になります。ただし、それはあくまでも考えかただけの話であり、実際にプログラミングで使用する際には同じだと考えても差し支えありません。なお、機能は大幅に制限されています。
まず、コンストラクタやデストラクタを含めて、メンバ関数を定義することができません。静的メンバを定義することもできません。アクセス指定子を使うこともできません。継承もできません。単純にデータメンバを並べることしかできないわけです。
構造体と共用体は後ほど詳しく解説したいと思います。
テンプレート
C99にはテンプレートの機能はまったくありません。テンプレートの機能に近いことを実現するには、マクロを使うのが普通です。
例外処理
C99には例外処理はありません。近いことを実現するにはふたつの方法があります。ひとつは goto を使う方法であり、もうひとつは setjmp と longjmp を使う方法です。ただし、goto は関数の外へ分岐することはできません(C++でも同じです)。また、setjmp と longjmp は必ずしも一般的ではありませんので、C++の例外のように、あたりまえのように使われるものではありません。普通は longjmp で関数から飛び出してくることを考慮する必要はないでしょう。
名前空間
C++の名前空間の機能はC99にはありません。C99の標準規格にも「名前空間」という用語が出てきますが、まったく別の意味です。すなわち、識別子は次に挙げるどれかの名前空間に属し、異なる名前空間どうしであれば、同じ名前をつけても別物として扱われるというものです。
- 関数原型
- ラベル名
- 構造体、共用体、列挙体のタグ名
- 構造体と共用体のメンバ
- その他の識別子
C++における名前空間がないため、関数の外部の有効範囲(いわゆるグローバルなスコープ)は、「大域的名前空間有効範囲」ではなく「ファイル有効範囲」という呼びかたをします。また、クラス有効範囲というものもありませんので、構造体や共用体のメンバは特別な有効範囲に属しているのではなく、(C99でいうところの)名前空間が異なるという扱いになります。
この記事のトラックバックURL:
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

