この章では、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 検討資料に指定されている、演算子と句読文字の代替表現のための予約語を示したものです。これらの代替表現は現在の C++ コンパイラには実装されていませんが、将来のリリースでは予約語として採用される可能性があるため、他の目的で使用しないでください。
表 6-2 演算子と句読文字に対する予約語
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 コードと分離するには、このマクロを使用します。
コードに #ifdef 文を挿入すれば、C++ コンパイラを使って、条件に応じて C か C++ をコンパイルできます。そのためには、__cplusplus マクロを使用します。
#ifdef _ _cplusplus extern "C" int myfunc(int); // C++ 宣言 #else int myfunc(); /* K&R C 宣言 */ #endif
これまでこのマクロは c_plusplus でしたが、現在は使用できません。
コンパイラは、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 リンケージを指定することはできません。そうした宣言は、大域のスコープでのみ行うことができます。