CからC++の外部変数や外部関数を呼ぶことが可能でしょうか?

ソースレベルで以下の逆みたいなことが出来ないでしょうか?リンク時に解決するならば、ベターな方法が知りたいです。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/03/03 23:16:20
  • 終了:--

回答(2件)

id:fruitage No.1

fruitage回答回数77ベストアンサー獲得回数02006/03/03 23:25:07

ポイント300pt

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からアクセスすることはできません。

id:tired

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

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

2006/03/04 00:41:20
id:Kityo No.2

キチョー id:Kityo回答回数161ベストアンサー獲得回数122006/03/04 08:48:05

ポイント300pt

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

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

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

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

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

【追記】

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

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

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

id:tired

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

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

2006/03/04 09:16:42

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません