extern 「C」 的學習總結

2021-10-02 13:54:06 字數 1697 閱讀 9662

原因和目的

原因由於c++支援函式過載,而c語言不支援函式過載,因此c++編譯器在編譯c++函式生成的函式符號和c語言編譯器編譯c函式生成的函式符號是有區別的,如下

int

add(

int a,

int b)

;// 使用c語言編譯器編譯生成的函式符號是 _add

// 使用c++編譯器編譯生成的函式符號類似是 add_int_int

目的

為了能夠實現c++**呼叫c語言**、而不出現因為函式生成的符號問題,導致出現符號未定義的問題,我們在c++**中呼叫c**,使用extern 「c」 會解決這個問題

注意extern 「c」 是c++的語法,在c語言中無法識別

__cplusplus 是c++自定義巨集,主要用來處理c和c++編譯混亂問題

示例**

示例一:c++**呼叫c**

// add.h c語言標頭檔案

#ifndef _add_h

#define _add_h

intadd

(int a,

int b)

;#endif

// add.c c語言原始檔

#include

"add.h"

intadd

(int a,

int b)

// test.h c++ 標頭檔案

#ifndef _test_h

#define _test_h

#ifdef __cplusplus

// c++編譯器自帶的巨集

extern

"c"#endif

#endif

// test.cpp c++原始檔

#include

"test.h"

#include

intmain()

示例二:c++**呼叫c**
// add.h c語言標頭檔案

#ifndef _add_h

#define _add_h

intadd

(int a,

int b)

;// 此處加成extern和不加extern都可以

#endif

// add.c c語言原始檔

#include

"add.h"

intadd

(int a,

int b)

// test.cpp c++原始檔

extern

"c"#include

intmain()

示例三:在c**中呼叫c++**
// add.h c++標頭檔案

#ifndef _add_h

#define _add_h

#ifdef __cplusplus

extern

"c"#endif

#endif

// add.cpp c++原始檔

#include

"test.h"

intadd

(int a,

int b)

// main.c c語言原始檔

#include

"add.h"

#include

intmain()

extern C 學習筆記

1.引言 有一道經典的程式設計師面試題,如下 為什麼標準標頭檔案都有和以下 相似的結構?ifndef duniangheadfile define duniangheadfile ifdef cplusplus extern c endif endif duniangheadfile 對於標頭檔案中...

C語言學習之extern C

extern c 的主要作用就是為了能夠正確實現c 呼叫其他c語言 加上extern c 後,會指示編譯器這部分 按c語言的進行編譯,而不是c 的。由於c 支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯後的 中,而不僅僅是函式名 而c語言並不支援函式過載,因此編譯c語言 的函式...

C 學習軌跡之extern C作用

1.extern c 的主要作用就是為了能夠正確實現c 呼叫其他c語言 加上extern c 後,會指示編譯器這部分 按c語言 而不是c 的方式進行編譯。由於c 支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯後的 中,而不僅僅是函式名 而c語言並不支援函式過載,因此編譯c語言 ...