C 和 C 混合編譯簡述

2021-10-10 23:13:57 字數 3632 閱讀 8268

一、extern「c」的作用(最重點)

1. extern "c"的真實目的是實現類c和c++的混合程式設計extern 「c」是由c++提供的乙個連線交換指定符號,用於告訴c++這段**是c函式extern 「c」後面的函式不使用的c++的名字修飾,而是用c。這是因為c++編譯後庫中函式名會變得很長,與c生成的不一致,造成c++不能直接呼叫c函式。

2.c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個函式的原型為:void foo(int x, int y);該函式被c編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。c++提供了c連線交換指定符號extern「c」來解決名字匹配問題。

3.被extern "c"限定的函式或變數是extern型別的;extern是c/c++語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。   

4.與extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。因此,乙個函式或變數只可能被本模組使用時,其不可能被extern 「c」修飾。

二、extern「c」與__cplusplus

#ifdef __cplusplus

extern "c"

#endif

cplusplus(c plus plus)即"c++",用於c++文件的標頭檔案中,上面**的意思是:如果是c++檔案(*.cpp)字尾,則使用extern 「c」,在c++專案中應用的非常廣泛。即使用gcc編譯器編譯,函式名為c型別如_foo。個人認為,搞懂了這兩個關鍵字,尤其是理解extern "c"(再次強調,不為過,呵呵),接下來的混合程式設計也就差不多了,哈哈哈。。。。

三、c呼叫c++函式(介面)

1.設計程式,共四個檔案

animal.cpp animal.h  main.c makefile

1.1 animal.h

[root@localhost cc++]#cat animal.h

#ifndef __animal_h__//防止被重複包含

#define __animal_h__

#ifdef __cplusplus

extern "c" ;

void print(void);

#ifdef __cplusplus

}#endif

#endif  // __animal_h__

1.2 animal.cpp:c++檔案

[root@localhost cc++]#cat animal.cpp

#include "animal.h"

#include

using namespace std;

animal::animal(char* data)//建構函式

animal::~animal()//析構函式}

char* animal::getname(void)

voidprint(void)//對外介面,而且必須有乙個非類中方法,才能被c呼叫

1.3 main.c:c檔案

[root@localhost cc++]#cat main.c

int main(void)

1.4 makefile

[root@localhost cc++]#cat makefile

main:main.c animal.o

gcc-lstdc++main.c animal.o -o main

animal.o:animal.h

g++ -c animal.cpp

.phony : clean

clean:

-rm animal.o main

2.測試

2.1生成可執行程式main

[root@localhost cc++]#make

g++ -c animal.cpp

gcc -lstdc++ main.c animal.o -o main

2.2執行可執行程式main

[root@localhost cc++]#./main

animal name is :dog

四、c++呼叫c函式

應該這個比較簡單,我就不多寫了,就直接寫**。

共有三個檔案:1.h 1.c  main.cpp

[root@localhost aa]#cat 1.h

#ifndef _1__h_

#define _1__h_

extern void print(char* );

#endif

[root@localhost aa]#cat 1.c

#include

#include "1.h"

void print(char* data)

[root@localhost aa]#cat main.cpp

extern "c"

int main(void)

gcc –c 1.c

g++ main.cpp 1.o

接著./a.out,又可以出現我們神奇的hello,world了,c++呼叫c**很簡單,但c呼叫c++介面可把我給累壞了,苦啊。就是這個gcc後面跟的-lstdc++害的,出現undefined reference to `__gxx_personality_v0'這個錯誤。是因為你用gcc編譯.cpp檔案(animal.cpp).按系統預設.cpp檔案是c++的檔案格式。

C與C 混合程式設計 編譯

1.工程檔案架構 drwxrwxr x 3 joshyoby joshyoby 4096 2月 25 15 03 drwxrwxr x 8 joshyoby joshyoby 4096 2月 25 14 45 rw rw r 1 joshyoby joshyoby 671 2月 25 14 58 m...

c與c 的混合編譯

記錄一次意外經歷 在c 函式中使用c 在函式前加上extern c 來註明 extern c 的主要作用就是為了能夠正確實現c 呼叫其他c語言 加上extern c 後,會指示編譯器這部分 按c語言的進行編譯,而不是c 的。由於c 支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯...

c和c 混合編譯的問題(extern C )

1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似c語言的全域性變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是一種...