2016-12-02 10 views
4

CソースコードをC++コードで使用しようとしています。私は、C-ヘッダで宣言されたC++コード体系でインスタンス化しようとすると、いくつかの困難を抱えています。そしてそれを値でC-関数に転送します。例:私は、スタック上のデータが不正確であることがわかりdummyFunction実行中C++コードでのC定義構造の使用

extern "C"{ 
    #include "dummyc.h" 
} 

int main(){ 
    DUMMYS s = {0,0,0,0}; 
    return dummyFunction(50,50,1,s); 
} 

dummyc.h:

#ifndef _DUMMY_C_H_ 
#define _DUMMY_C_H_ 

typedef struct { 
    int a; 
    int b; 
    int c; 
    int d; 
}DUMMYS; 

int dummyFunction(unsigned int a, unsigned int b, unsigned short c, DUMMYS dummy); 

#endif 

dummyc.c:

#include "dummyc.h" 

int dummyFunction(unsigned int a, unsigned int b, unsigned short c, DUMMYS dummy){ 
    return 1; 
} 

dummycpp.cpp 。彼らはシフトされたように見えますか?どのように私はこれを正しく行うことができますか?私はARM用にGCC 4.3.4を使っています。

+5

あなたが言っていることを確認するためにコンソールに結果を印刷してください。私の最後にはすべてが正しいように見えます。 –

+3

表示されているコード例では、「悪い」という唯一の事は、先頭にアンダースコアがついているシンボルを使用し、続いて大文字(ヘッダーを含むガード)を使用することです。 [そのようなシンボルは予約されている](http://stackoverflow.com/a/228797/440558)。それ以外は、同じABIをターゲットとするコンパイラで両方のソースファイルをコンパイルする限り、間違いはありません。 –

+5

また、スタック上のデータが正しくないことをどのように見ているか説明してください。 –

答えて

1

'extern "C"ディレクティブは実際には関数宣言のためだけに重要です。これは、C++に関数のオーバーロードがあるためです。私はいつも#ifdef __cplusplusを使ってヘッダファイルに関数シグネチャの周りにディレクティブを埋め込みました。

#ifndef _DUMMY_C_H_ 
#define _DUMMY_C_H_ 

typedef struct { 
int a; 
int b; 
int c; 
int d; 
}DUMMYS; 

#ifdef __cplusplus 
extern "C" { 
#endif 

int dummyFunction(unsigned int a, unsigned int b, unsigned short c, DUMMYS dummy); 

#ifdef __cplusplus 
} 
#endif 

#endif 

(構造体は完全にCとC++の両方に合法的なもので構成されている場合)、CおよびC++は、構造体にメンバーを置く方法に違いはありません。

dummyc.hでこの変更を行うと、dummycpp.cppの#includeディレクティブで 'extern "C"'を削除できます。

+0

これはプログラムの動作に何の違いもありません –

関連する問題