No.1ベストアンサー
- 回答日時:
一般的には不可能です。
既存のC++コードを修正することなく、Cから呼び出すには、extern "C++" void f();
extern "C" int call_f() throw()
{
try
{
f();
}
catch (...)
{
return -1;
}
return 0;
}
のようなラッパー関数を作り、それを呼び出す必要があります。
なお、C++の関数のマングル名を調べて強引に呼び出すことも、場合によっては可能ですが、処理系によってはC++結合とC結合のコーリングコンベンションが異なる場合があるので要注意です。また、仮に問題なく呼び出せたとしても、C++の関数から送出された例外を処理することができませんので、破綻するのは目に見えています。
この回答への補足
現在,C++言語で記述された下位ライブラリから、C言語で関数を呼び出さなければならない状態にあります。
しかし、下位のライブラリがMinGWで実装されたものであり、.soファイルや.oファイルなどのライブラリファイルとC++ソースコードからなるという複雑な構造をしています。
しかも、上位のC言語プログラムはVisual Studioで動作させなければなりません。
どのようにすればこのような要求を満足できるソードを作成できるかを教えていただければ幸いです。
No.3
- 回答日時:
cのソースをc++としてコンパイルするのはだめなのですか?
GNUなら以下のコードで
gcc source.c では通りませんが、
g++ source.c なら通ります。
分割してあったとしても同様です。
#include<stdio.h>
int sub(int a){
return a;
}
int sub(int a, int b){
return a + b;
}
int main(){
printf("%d\n", sub(1));
printf("%d\n", sub(1, 2));
}
No.2
- 回答日時:
> しかし、下位のライブラリがMinGWで実装されたものであり、.soファイルや.oファイルなどのライブラリファイルとC++ソースコードからなるという複雑な構造をしています。
> しかも、上位のC言語プログラムはVisual Studioで動作させなければなりません。
MinGWで実装されたものだけを集めてDLLを作ってください。
そして、エクスポートする関数は、すべてCのインタフェースを持たせてください。Visual Studioとのことですが、VB等からの呼出しのことも考えると、__stdcallにしておいた方が融通が利く可能性があります。その場合、引数や返却値の型にも十分注意を払ってください。
また、前回も書きましたが、C結合にするだけでは不十分で、例外処理をDLLの外に漏らさないように、内部ですべてcatchし、エラーコードに置き換える必要があります。
もう一点、long double型のサイズがMinGWとVisual C++では異なります。また、double _Complex型や_Bool型など、C99の型はVisual C++では使えませんので要注意です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Excel(エクセル) スプレッドシートの関数 2 2022/11/16 17:36
- 数学 a乗根の中にb乗根がありそのまた中にc乗根があるような計算をと呼ぶのでしょうか 4 2022/06/24 09:00
- 高校 高校生です。数学に関して、 pとcの違いが全くわかりません。 並べるのはpで選ぶのはc 選ぶだけがc 2 2022/07/23 17:18
- Mac OS 【USB-Cの充電】2本差しすると高速充電になる?故障の原因になる? 2 2022/08/08 09:38
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- Excel(エクセル) エクセルからスプレッドシートに数式を移植で起こるエラーについて。 2 2023/08/05 10:56
- Excel(エクセル) 関数式を教えてください。 AとBのセルがあり、Aのセルに値がある場合はCのセルへ1と表示。 AとBの 5 2022/03/23 14:38
- 数学 解析学の問題がわからず困っています。 2 2023/01/12 23:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
【C++】関数ポインタの使い方
-
アスタリスクで正方形
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
異なる文字列のマッチングを、D...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
ファイルから読みこむ方法
-
課題でつまってます・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報