變數和函式混合呼叫

2021-06-21 03:49:15 字數 2914 閱讀 8464

第一部分:c++呼叫c變數或函式

如果我想在c檔案中實現某些功能,在cpp檔案實現對這些功能的呼叫,我該如何做呢?

先將程式貼出來,然後在分析:

[cpp]view plain

copy

// file name : inct.h

#ifndef _inct_h_

#define _inct_h_

#define num 8

#ifdef __cplusplus

extern

"c"   

#endif

#endif

[cpp]view plain

copy

//file name : inct.c

#include "inct.h"

#include 

#include 

int g_data[4][num]= \  

,\  

,\  

,\  

\  };\  

int* func(int n)    

[cpp]view plain

copy

// file name : test.cpp

#include 

#include 

#include 

#include "inct.h"

#include 

#include 

using

namespace std;  

int main(int argc, char **argv)  

free(data);  

return 0;  

}  

我將這樣編譯:

1、首先將inct.c編譯:

[cpp]view plain

copy

gcc -c -i. inct.c  

此編譯將會輸出:inct.o

執行過程分析:gcc編譯時,並沒有預先定義__cplusplus這個巨集,所以extern "c"並沒有有效,inct.h被作為一般的c程式編譯成功。

2、將test.cpp用c++編譯器編譯:

[cpp]view plain

copy

g++ -c -i. test.cpp  

輸出 test.o

g++中定義了__cplusplus,所以,test.cpp中對inct.h中所有功能引用都新增了extern 「c」,這樣一來,c++中的程式引用.h中的東西時,就將他們看成由c編譯器編譯成的程式了。編譯也沒有問題。

3、將所有編譯中間結果鏈結起來

[cpp]view plain

copy

g++ test.o inct.o -o test  

第二部分:c中呼叫c++的函式或變數

先貼**:

inct.h的內容沒有改變。

將inct.c改為inct.cpp,並且修改下程式內容:

[cpp]view plain

copy

//file name : inct.c

#include "inct.h"

#include 

using

namespace std; //使用std命名空間

int g_data[4][num]= \  

,\  

,\  

,\  

\  };\  

int* func(int n)    

將test.cpp修改為test.c,內容改變為:

[cpp]view plain

copy

// file name : test.c

#include "inct.h"

#include 

#include //嫣然都是c的標頭檔案

int main(int argc, char **argv)  

free(data); //將new來的資料free掉

return 0;  

}  

這樣編譯:

1、首先將inct.cpp編譯:

[cpp]view plain

copy

g++ -c -i. inct.cpp  

此編譯將會輸出:inct.o

執行過程分析:g++編譯時,預先定義__cplusplus這個巨集,所以extern "c"有效,inct.h被作為一般的c++程式編譯成功,但是編譯後的變數和函式可以在c或c++程式中使用。

2、將test.c用c編譯器編譯:

[cpp]view plain

copy

gcc -c -i. test.c  

輸出 test.o

gcc中沒定義__cplusplus,所以,test.c中對inct.h中所有功能引用都沒新增了extern 「c」,這樣一來,c語言程式正常引用這些函式或變數。

特別注意 extern "c"是c++中才有的,在c中只有extern,用在變數前,表示變數的宣告,不表示變數的定義。

3、將所有編譯中間結果鏈結起來

[cpp]view plain

copy

g++ test.o inct.o -o test  

或者 [cpp]view plain

copy

gcc test.o inct.o -o test -lstdc++  

來自:

混合呼叫服務

1.呼叫服務放在oncreat 中或把返回服務的內容放在conn中 2.既要保證服務長期後台執行,又要呼叫服務裡面的方法 3.混合呼叫的服務的生命週期 服務長期後台執行,又想呼叫服務的方法 1.start方式開啟服務 保證服務長期後台執行 2.bind方式繫結服務 保證呼叫服務的方法 3.unbin...

C和C 混合呼叫

extern c char strcpy char const char 注意它與下面的宣告的不同之處 extern char strcpy char const char 下面的這個宣告僅表示在連線的時候呼叫strcpy extern c 指令非常有用,因為c和c 的近親關係。注意 extern ...

C 與C變數或函式的混合呼叫

第一部分 c 呼叫c變數或函式 如果我想在c檔案中實現某些功能,在cpp檔案實現對這些功能的呼叫,我該如何做呢?先將程式貼出來,然後在分析 cpp view plain copy file name inct.h ifndef inct h define inct h define num 8 if...