掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26333

C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---RingBuffer(2006/03/06 16:03:09)


C++で作成されたクラスの中でCで作った関数を呼びたいのですが
思うようにいきません。

まず、C単体で動くものを作りました。
C++でもその関数を外し単体なら動くものです。

そこで、Cのヘッダファイルに
#ifdef __cplusplus
    extern "C" {
#endif
    void aaa(char *p1, char *buff1, char *buff2);
#ifdef __cplusplus
    } /* closing brace for extern "C" */
#endif

とし、
C++のcppファイルの方には
extern "C" {
#include "C_head.h"
}

int RingBuffer::safe_read(int fd, void *data, uint sz)
{
    char data1[sz];

    aaa("abcdefgh", data1, data);
}

としてコンパイルを行ったところ
RingBuffer.cpp:393: error: ‘aaa’ was not declared in this scope
とコンパイルすらできません。
何がまずいのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C++にCの関数を取り込む場合のコンパイル、リンク方法 26334 REE 2006/03/06 18:46:30
<子記事> Re:C++にCの関数を取り込む場合のコンパイル、リンク方法 26336 nop 2006/03/06 20:17:44
<子記事> Re:C++にCの関数を取り込む場合のコンパイル、リンク方法 26337 YuO 2006/03/06 20:27:29


No.26334

Re:C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---REE(2006/03/06 18:46:30)


>C++のcppファイルの方には
>extern "C" {
>#include "C_head.h"
>}

とりあえず、このextern "C"は不要でしょう。
C_head.hに既に含まれていますので。


この投稿にコメントする

削除パスワード

No.26335

C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---RingBuffer(2006/03/06 20:11:49)


>>C++のcppファイルの方には
>>extern "C" {
>>#include "C_head.h"
>>}
>
>とりあえず、このextern "C"は不要でしょう。
>C_head.hに既に含まれていますので。
まあそうでしたね。
ただ削除しても状況は同じですね。
エラーメッセージの
'aaa' was not declared in this scope
このスコープでは宣言されていない。といわれても
どこに宣言すればいいのってことなんでしょうがね。
新しい言語を生み出すんだったら、馬鹿にもわかる簡単なサンプルでも
作ってから提案しろと思ってしまいますよ。


この投稿にコメントする

削除パスワード

No.26336

Re:C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---nop(2006/03/06 20:17:44)


> aaa("abcdefgh", data1, data);

::aaa("abcdefgh", data1, data);

でいけない?


この投稿にコメントする

削除パスワード

No.26337

Re:C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---YuO(2006/03/06 20:27:29)


> aaa("abcdefgh", data1, data);
>としてコンパイルを行ったところ
>RingBuffer.cpp:393: error: ‘aaa’ was not declared in this scope
>とコンパイルすらできません。
>何がまずいのでしょうか?

"abcdefgh"はconst char [9]型ですから,
関数呼び出し式中では,const char *型になります。

それに対して,aaaの第一引数はchar *ですから,"abcdefgh"を渡すことは出来ません。
故に,この呼び出しに対応する宣言が存在しないことになります。
つまり,このエラーメッセージは正常です。

まずは,ヘッダファイル中の関数宣言に正しくconstを付けることからです。



この投稿にコメントする

削除パスワード

No.26338

C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---RingBuffer(2006/03/06 20:33:42)


>> aaa("abcdefgh", data1, data);
>>としてコンパイルを行ったところ
>>RingBuffer.cpp:393: error: ‘aaa’ was not declared in this scope
>>とコンパイルすらできません。
>>何がまずいのでしょうか?
>
>"abcdefgh"はconst char [9]型ですから,
>関数呼び出し式中では,const char *型になります。
>
>それに対して,aaaの第一引数はchar *ですから,"abcdefgh"を渡すことは出来ません。
>故に,この呼び出しに対応する宣言が存在しないことになります。
>つまり,このエラーメッセージは正常です。
>
>まずは,ヘッダファイル中の関数宣言に正しくconstを付けることからです。

その通りでした。
ようやく解決しそうです。
コンパイルは通りました。
リンクに少なくとも1時間はかかりますので、その後結果をおしらせ致します。
(明日かも知れません。)
しかし謎がとけて一安心です。


この投稿にコメントする

削除パスワード

No.26339

C++にCの関数を取り込む場合のコンパイル、リンク方法
投稿者---RingBuffer(2006/03/06 21:53:35)


>>> aaa("abcdefgh", data1, data);
>>>としてコンパイルを行ったところ
>>>RingBuffer.cpp:393: error: ‘aaa’ was not declared in this scope
>>>とコンパイルすらできません。
>>>何がまずいのでしょうか?
>>
>>"abcdefgh"はconst char [9]型ですから,
>>関数呼び出し式中では,const char *型になります。
>>
>>それに対して,aaaの第一引数はchar *ですから,"abcdefgh"を渡すことは出来ません。
>>故に,この呼び出しに対応する宣言が存在しないことになります。
>>つまり,このエラーメッセージは正常です。
>>
>>まずは,ヘッダファイル中の関数宣言に正しくconstを付けることからです。
>
>その通りでした。
>ようやく解決しそうです。
>コンパイルは通りました。
>リンクに少なくとも1時間はかかりますので、その後結果をおしらせ致します。
>(明日かも知れません。)
>しかし謎がとけて一安心です。

うまくいきました。皆様どうもありがとうございました。
しかし、これから大変なデバック作業が始まる予感。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧