はじめに

CのコードとC++のコードが混在する環境では、CのコードからC++のコードを呼び出すことが必要になる場合があります。
このページでは、CのコードからC++のコードを呼び出す方法について説明します。

尚、逆にC++のコードからCのコードを読み出す方法については「C++のコードからCのコードを読み出す」のページをご参照ください。

呼び出される側のC++のコード

Cのコードから、C++のコードを直接呼び出すことは出来ないため、C++のコード側でCのコードに利用させる部分を「extern "C"」宣言します。

C++のコード
#include <stdio.h>

class Person
{
    public: virtual void ask();
};

class GoodPerson : public Person
{
    public: void ask()
    {
        puts("そんなことしちゃ駄目だよ!");
    }
};

class EvilPerson : public Person
{
    public: void ask()
    {
        puts("やっちまえよ、へっへっへ…");
    }
};

extern "C" void askOpinion()
{
    Person *tPerson;

    tPerson=new GoodPerson();
    tPerson->ask();
    delete(tPerson);

    tPerson=new EvilPerson();
    tPerson->ask();
    delete(tPerson);
}

呼び出す側のCのコード

呼び出す側のCのコードでは、「extern "C"」宣言したコードをそのまま利用することが可能です。

Cのコード
#include <stdio.h>

void main()
{
    askOpinion();
}


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まさにこれだ
33 (73%)
参考になった
6 (13%)
ちょっと違う
2 (4%)
これじゃない
4 (9%)

【まさにこれだ】 ありがとうございます! ぐぐると逆の「C のコードからCのコードを読み出す」の方法は腐るほど見つかるのですが、この「CのコードからC のコードを利用する」方法はあまりなかったので、助かりました。 と思って、5年ほど前に自分で書いた.cpp ファイルを開いてみると、ちゃんとこの記事通りに書かれていて、あの頃の自分は今よりもちゃんとしてたなぁなどと遠い目をしてしまいました。 私が失った脳細胞の肩代わりをしていただき、ありがとうございました! (2023/01/14 Sat 14:23:21)

【参考になった】 "extern "C""で宣言したブロック内にはC の文法が使えるんかいな (2021/03/15 Mon 18:16:52)

【これじゃない】 複数インスタンスの扱いが分からなかった (2020/02/15 Sat 02:24:36)