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 検討資料に指定されている、演算子と句読文字の代替表現のための予約語を示したものです。これらの代替表現は現在の 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 関数を装った」C++ 関数を呼び出すには、extern “C” 宣言を使用して、この符号化を禁止する必要があります。次に例を示します。


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

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

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

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