C言語関係掲示板

過去ログ

No.1333 CPPソースからCソース内に書かれた外部関数の呼び出し方法

[戻る] [ホームページ]
No.18024

初心すぎるのですが・・・
投稿者---電話番(2004/11/12 14:47:02)


いつもお世話になっています。

VC6.0環境でボタンを押すと外部関数をコールして
表示をさせるプログラムを作成したいのですが
どうしても出来ません。

<呼び出し側>
#include "Test.h"   
        :
        :
void CTestRTCDlg::OnButton1() 
{
    short ret;
    
    ret = SubMain();

    afx_msg(ret);
    
}

<呼ばれる関数>
#include "Test.h"         /*テストモジュール宣言関数*/
short int SubMain(void)
{
    short int i;

    return 1;
}

<作成ヘッダー>
extern short int SubMain(void);
short int SubMain(void);

を実行すると

rror LNK2001: 外部シンボル ""short __cdecl SubMain(void)" (?SubMain@@YAFXZ)" は未解決です

というエラーが出ます。

どなたかご教授願います。




No.18025

Re:初心すぎるのですが・・・
投稿者---επιστημη(2004/11/12 14:51:18)


><pre>いつもお世話になっています。

V<呼ばれる関数>
#include "Test.h" /*テストモジュール宣言関数*/
short int SubMain(void)
{
 short int i;
 return 1;
}

この関数の実装は C(Test.c)ですか? C++(Test.cpp)ですか?




No.18026

Re:初心すぎるのですが・・・
投稿者---電話番(2004/11/12 14:54:30)


<呼ばれる関数>
>#include "Test.h" /*テストモジュール宣言関数*/
>short int SubMain(void)
>{
> short int i;
> return 1;
>}
>この関数の実装は C(Test.c)ですか? C++(Test.cpp)ですか?
>

呼ばれる側はcです。



No.18027

Re:初心すぎるのですが・・・
投稿者---επιστημη(2004/11/12 14:57:15)


>>この関数の実装は C(Test.c)ですか? C++(Test.cpp)ですか?
>呼ばれる側はcです。

だからです。C++からCを呼ぶには

extern "C" short int SubMain(void);

と宣言しなければなりません。



No.18029

Re:初心すぎるのですが・・・
投稿者---電話番(2004/11/12 15:07:08)


>extern "C" short int SubMain(void);
>
>と宣言しなければなりません。

実行してみたところ
RTC_TestMain.c
error C2059: 構文エラー : 'string'
コードを生成中...
コンパイル中...
TestDlg.cpp
error C2732: リンケージ指定は、別の 'SubMain' に対する指定と矛盾しています。
e:\test\ 'SubMain' の宣言を確認してください。
コードを生成中...
cl.exe の実行エラー

というエラーが出てきました。
extern部分のみの書き換えではいけなかったのでしょうか?



No.18031

Re:初心すぎるのですが・・・
投稿者---επιστημη(2004/11/12 15:29:42)


>extern部分のみの書き換えではいけなかったのでしょうか?

Test.h になんと書いたのですか?




No.18032

Re:初心すぎるのですが・・・
投稿者---電話番(2004/11/12 15:32:26)


>>extern部分のみの書き換えではいけなかったのでしょうか?
>
>Test.h になんと書いたのですか?
>

short int SubMain(void);
extern "C" short int SubMain(void);

です。


No.18033

Re:初心すぎるのですが・・・
投稿者---επιστημη(2004/11/12 15:36:44)


>short int SubMain(void);
>extern "C" short int SubMain(void);

マチガイ。これではCが通してくれない。
CとC++の両方で#includeできるように書かなくてはなりません。
正しくは:

#ifdef __cplusplus
extern "C" {
#endif
short int SubMain(void);
#ifdef __cplusplus
}
#endif



No.18034

CPPソースからCソース内に書かれた外部関数の呼び出し方法
投稿者---電話番(2004/11/12 15:42:44)



>マチガイ。これではCが通してくれない。
>CとC++の両方で#includeできるように書かなくてはなりません。
>正しくは:
>
>#ifdef __cplusplus
>extern "C" {
>#endif
> short int SubMain(void);
>#ifdef __cplusplus
>}
>#endif

成功しました。ありがとうございます!
ご教授、ありがとうございました。





No.18028

Re:初心すぎるのですが・・・
投稿者---επιστημη(2004/11/12 15:00:39)


> いつもお世話になっています。

であればマナー/ルールはわきまえておいででしょう。
「初心すぎるのですが・・・」などというタイトルは避けてください。

【掲示板ご利用上の注意】の第一項に: ※題名は具体的に! とあります。



No.18030

Re:初心すぎるのですが・・・
投稿者---電話番(2004/11/12 15:08:49)


>> いつもお世話になっています。
>
>であればマナー/ルールはわきまえておいででしょう。
>「初心すぎるのですが・・・」などというタイトルは避けてください。
>
>【掲示板ご利用上の注意】の第一項に: ※題名は具体的に! とあります。

本当に申し訳ないです。
今後、気をつけます。