原因和目的
原因由於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語言 ...