2016-12-02 63 views
4

我想在C++代碼中使用C源代碼的函數。當我嘗試在C頭中聲明的C++代碼結構中實例化,然後通過值將其傳遞給C函數時,我遇到了一些困難。例如:在C++代碼中使用C定義的結構

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:

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

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

在dummyFunction執行我看到,堆棧數據是不正確。看起來他們在哪裏轉移?我怎樣才能正確做到這一點?我使用GCC 4.3.4 for ARM。

+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

這對程序的行爲沒有任何影響 –