人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CからC++の外部変数や外部関数を呼ぶことが可能でしょうか?
ソースレベルで以下の逆みたいなことが出来ないでしょうか?リンク時に解決するならば、ベターな方法が知りたいです。

extern ”C”{ extern void hoge(void); }

●質問者: tired
●カテゴリ:コンピュータ
✍キーワード:C++ hoge void ソース ベター
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● fruitage
●300ポイント

http://www.hatena.ne.jp/1141395380#

人力検索はてな - CからC++の外部変数や外部関数を呼ぶことが可能でしょうか? ソースレベルで以下の逆みたいなことが出来ないでしょうか?リンク時に解決するならば、ベターな方法が知りた..

C++側で


extern ”C” void hoge(void) { ... }

extern ”C” int foo = 123;


のように定義してやれば、C側で


extern void hoge(void);

extern int foo;


として使用することができます。

C++側で何の対処もしていない場合、少なくとも移植性のある方法でCからアクセスすることはできません。

◎質問者からの返答

回答ありがとうございます。

上記の場合は、C++からexternする場合もextern ”C”とする必要があるのですね。何も対処をしていない場合はリンク時しかないのかな〜?リンクレベルではどうしているのかな?ということで次の回答をみてみたいです。お願い致します。


2 ● キチョー id:Kityo
●300ポイント

http://www.pagesupli.com/cgi-bin/nph-web.exe?q=%E3%83%9E%E3%83%B...

マングリング #1- pageone

処理系に依存しない方法はないと思います。

お使いのC++言語処理系のマングリング・ルールを調べて下さい。

変形後の名前(ラベル名)が、お使いのC言語処理系で変数名や関数名として利用可能な名前にたまたま収まっていれば、外部参照可能な可能性があります。

変数の場合は普通に考えて上記の条件だけで可能ですが、関数の場合はお使いの処理系の呼び出し規約も確認したほうが良いかも知れません。(引数のスタックへの格納順序などが違うかも知れない)

関数の場合、呼び出し側(C言語側)で暗黙の引数の類(thisポインタとか)を補ってあるのを忘れないように注意して下さい。

【追記】

C側のプログラムを、C++モードでコンパイルしては如何でしょうか?

それなら、簡単に、処理系依存なく、CからC++の外部変数や外部関数を外部参照出来たっぽくなります。

(非公開場合も多いマングリング・ルールを調べたりするよりは、C側のプログラムでC++モードだとコンパイルエラーになる部分を直すほうが気軽かも。)

◎質問者からの返答

回答ありがとうございます。

私の用途として、ターゲットをCで実装する前提があり、机上デバッグでは、ドライバやOS部分を楽なC++でコーディングしていました。CでC++をコールする際は、C++部分をDLL化しておいて呼んでいましたが、割り切って、拡張子を無視してC++でコンパイル出来るのならば、そうした方が無難なようですね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ