1.c++的編譯和連線
函式同名不同參,在 c++ 是合法的
void foo(int i);
void foo(char c);
void foo(float f);
void foo(char* s);
c++ 在編譯時,以上函式將被編譯為類似下列符號
_foo_int
_foo_char
_foo_float
_foo_string
鏈結時也會去尋找是否有這樣的符號
2.c的編譯和鏈結
c 在編譯時函式符號不會帶上引數型別,因此以上列出函式都被編譯為_foo
#include
void foo(int i);
void foo(char i);
int main(int argc, char
const *argv)
c 編譯器當發現第二個同名函式宣告時,若型別不相同,則會觸發型別衝突錯誤。
3.extern 「c」
在c/c++混合專案中會看到下面的**
#ifdef __cplusplus
extern "c"
#endif
extern : 宣告編譯器遇到此變數和函式時在其他模組中尋找其定義
「c」: 表示一種符合 c 語言編譯和連線的規則
因此當 c++ 編譯器遇到被 extern 「c」 修飾的**時,將按照 c 語言方式編譯和鏈結。c 不支援 「c」,這裡 c++ 使用 」 __cplusplus 」 編譯開關選擇。
4.c 呼叫 c++ **
cpp_fun.h
/* c++ 標頭檔案 */
#ifndef cpp_fun_h
#define cpp_fun_h
class
math
;#endif /* cpp_fun_h */
cpp_fun.cpp
/* c++ 現實庫 */
#include "cpp_fun.h"
int math::add(int a, int b)
mid.h
/* c++ 中間標頭檔案 */
#ifndef mid_h
#define mid_h
#ifdef __cplusplus
extern "c"
#endif
#endif /* mid_h */
mid.cpp
/* c++ 中間介面庫,封裝類方法 */
#include "mid.h"
#include "cpp_fun.h"
int add_cpp(int a, int b)
main.c
/* c 原始碼呼叫 c++ 方法 */
#include "stdio.h"
#include "mid.h"
int main()
makefile
all:
g++ -c cpp_fun.cpp cpp_fun.h
g++ -c mid.cpp mid.h cpp_fun.h
gcc -c main.c mid.h
- rm *.o *.gch
5.c++ 呼叫 c **
c.h
/* c 標頭檔案 */
#ifndef c_h
#define c_h
#ifdef __cplusplus
extern "c"
#endif
#endif /* c_h */
c_fun.c
/* c 原始碼庫 */
#include
#include "c.h"
void c_fun(int i)
main.cpp
/* c++ 原始碼呼叫 c 函式 */
#include "c.h"
int main(int argc,char** argv)
makefile
all:
gcc -c c_fun.c c.h
g++ -c main.cpp c.h
- rm *.o *.gch
C C 混合程式設計
c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...
C C 混合程式設計
分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...
C C 混合程式設計
現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙個連線交換指定符號,用於告訴 這段 是 函式。extern c 後面的函式不使用的c 的名字修飾,而是用c。這是因為c 編譯後庫中函式名會...