C++ 移行ガイド ホーム目次前ページへ次ページへ索引


第 6 章

C から C++ への移行

この章では、C プログラムを C++ プログラムに移行する方法について説明します。

一般的に、C プログラムを C++ プログラムとしてコンパイルするにあたって必要な修正はほとんどありません。C と C++ はリンク時の互換性があるため、C++ コードとリンクするために、コンパイル済みの C コードを修正する必要はありません。C++ 言語の個別の情報につては、『The C++ Programming Language』(Margaret A. Ellis、Bjarne Stroustrup 共著) を参照してください。

予約キーワードと事前定義済みのキーワード

表 6-1 に、C++ および C の全予約キーワードと、C++ で事前定義されているキーワードを示します。C++ では予約されていて、C では予約されていないキーワードは太字で示しています。

表 6-1   予約キーワード
asm do if return typedef
auto double inline short typeid
bool dynamic_cast int signed typename
break else long sizeof union
case enum mutable static unsigned
catch explicit namespace static_cast using
char export new struct virtual
class extern operator switch void
const false private template volatile
const_cast float protected this wchar_t
continue for public throw while
default friend register true
delete goto reinterpret_cast try


__STDC__ は、あらかじめ値 0 に定義されています。たとえば、次のコードがあるとします。

#include <stdio.h>
main()
{
    #ifdef __STDC__
        printf("yes\n");
    #else
        printf("no\n");
    #endif

 
    #if    __STDC__ ==0
        printf("yes\n");
    #else
        printf("no\n");
    #endif
}

この結果は次のようになります。

yes
yes

次の表は、ISO C++ 標準委員会の現在の ANSI/ISO 検討資料に指定されている、演算子と句読文字の代替表現のための予約語を示したものです。

表 6-2   演算子と句読文字に対する C++ の予約語
and bitor not or xor
and_eq compl not_eq or_eq xor_eq
bitand




汎用ヘッダーファイルの作成

K&R C、ANSI C、C++ にはそれぞれ異なるヘッダーファイルが必要です。C++ ヘッダーファイルを K&R C 標準と ANSI C 標準に準拠する汎用ヘッダーファイルにするには、マクロ __cplusplus を使って、C++ コードと C コードを分離する必要があります。また、マクロ __STDC__ は ANSI C にも C++ にも定義されています。C++ や ANSI C コードを K&R C コードと分離するには、このマクロを使用します。詳細は、『C++ プログラミングガイド』を参照してください。


注 - 以前の C++ コンパイラが事前定義していたマクロ c_plusplus は、現在はサポートされていません。代わりに __cplusplus を使用してください。

C 関数へのリンク

コンパイラは、C++ 関数名を符号化して、多重定義を可能にします。C 関数あるいは「C 関数を装った」C++ 関数を呼び出すには、extern "C" 宣言を使用して、この符号化が行われないようにする必要があります。次に例を示します。

extern "C" { 
double sqrt(double); //sqrt(double) は C リンケージを持つ
    } 


このリンケージ指定によって sqrt() を使用するプログラムの意味が変わることはありません。sqrt() に対して、コンパイラが C の命名規則を使用することになるだけです。

C リンケージを持つことができるのは、複数の多重定義の C++ 関数のうちの 1 つだけです。つまり、C プログラムから呼び出す C++ 関数に C リンケージを使用することはできますが、使用できるのは、その関数の 1 つのインスタンスだけということになります。

関数定義の中で C リンケージを指定することはできません。そうした宣言は、大域のスコープでのみ行うことができます。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引