我擦 遇到個大坑啊 C和C 混合編譯問題

2021-08-20 21:21:27 字數 930 閱讀 3592

在c語言中,編譯器對於函式 int test()和int test(int a)的編譯結果得到的函式名是一樣的,所以c語言不能過載

而在c++中int test()和int test(int a)編譯後生成不同名字的函式,所以支援過載

1.這就產生了問題,如果在c++中呼叫c語言的int test(int a)函式,會連線錯誤,因為編譯後找不到對應名稱的函式(c和cpp生成的函式名不同)

所以需要在cpp檔案中如果要使用int test(int a)函式,需要在(include下面)用extern "c" int test(int a)

如果呼叫的c函式特別多,也可以用下面的方式宣告

extern "c"

或者extern "c"

2.如果要在.c檔案中需要呼叫cpp函式需要在.cpp檔案中用extern "c"

然後系統在編譯這個函式的時候就會自動按照c語言的規則進行編譯

3.如果要寫一套函式庫,同時提供給c和cpp使用,那必須用c語言規則進行編譯

如果是寫在cpp檔案中的,必須要加extern "c"宣告

--1.在cpp檔案中加上extern,讓函式編譯是用c規則編譯

--2.在呼叫者的cpp檔案中用extern "c"

4.但是3的實現比較麻煩,只要呼叫通用函式就得在呼叫者的cpp檔案中用extern引入標頭檔案

解決方法:在通用函式的.h和.cpp檔案中,都用extern來宣告--(但是此時就會讓c呼叫不了通用函式,因為c裡面沒有extern,c包含的標頭檔案包含extern,所以編譯通不過)

所以要在通用函式的.h檔案裡面用

#ifdef __cplusplus

extern "c"

#endif

因為cpp在編譯時會自動生成__cplusplus這個巨集,所以利用這一點,可以實現c檔案中不包含extern

cpp中包含extern

C 和 C 混合編譯簡述

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

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

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

C和C 的混合編譯 extern 「C」的使用

在實際程式設計中,有時會需要用到c c 的混合編譯,通過extern c 即可實現混合編譯,以下是個人參照的資料以及自己的實際操作的收穫。一 c 中呼叫c程式 中print函式通過extern c 來指明按照c的編譯方式來編譯,編譯完成執行結果如下 二 在c中呼叫c 程式,分三個檔案進行 1 cpp...