C 中extern的用法

2021-08-25 16:26:23 字數 1493 閱讀 8583

1. 宣告外部實體

宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如:

extern int ivalue;

此時的extern是必須的,省略了extern編譯器將視為定義而不是宣告,一般地在源**中定義變數並進行初始化,在標頭檔案中使用extern宣告變數。

類似地用於宣告外部全域性函式,表示該函式在其它編譯單元中定義,如:

extern void func( void );

此時的extern可以省略。

2. 宣告函式的編譯和鏈結方式

extern 後可以跟」c」或」c++」用於宣告全域性函式的編譯和鏈結方式,例如:

extern 「c」 void add( int a, int b);

extern 「c++」 void sum(int* ia, int leng);

void sum(int* ia, int leng);

其中的extern 「c++」可以省略,它是在c++中預設的鏈結方式,即後面兩種宣告方式是等效的。這種宣告有兩種含義:首先,宣告這些函式使用外部鏈結方式,其實現不在本編譯單元之內;另一種含義,則是告訴編譯器編譯方式,如extern 「c」則是告訴編譯器使用c語言的編譯方式編譯該函式。

c++支援函式過載,所以引數不同在編譯後生成的函式名也不同,如:

int max(int a, int b);

int max(float a, float b);

在編譯時生成的函式名可能分別為_max_int_int、_max_float_float,通過在函式名後加上引數型別來區分不同的函式,如果使用c語言方式,則生成的函式名中不包含引數資訊,只生成_max,所以無法實現過載,也就是說在extern 「c」中不能出現函式名過載,例如:

extern 「c」

非法,編譯器將報錯。而c++標準中並沒有定義extern 「c」與extern 「c++」的具體實現方式,不同編譯器生成的符號規則可能不同。

需要注意的是,如果函式宣告使用了extern 「c」,則函式定義必須使用c編譯器編譯,或者使用extern 「c」來修改函式的編譯方式,一般地將extern 「c」宣告的函式的定義所在的源程式副檔名使用.c即可,而c++**放在.cpp檔案中。如果將extern 「c」宣告的函式實現也放在.cpp中,則需要使用extern 「c」來宣告函式編譯方式,例如:

extern 「c」

}只有在c++中使用c語言的庫或者兩種語言混合程式設計的時候才會用到extern 「c」,而在c語言中是不支援extern 「c」的,所以為了標頭檔案通用,需要使用巨集來控制,例如:

#ifndef max_h // 防止重複引用

#define max_h

#ifdef __cplusplus

extern "c"

#endif

#endif

其中__cplusplus為c++定義的巨集,凡是c++的編譯器都定義了該預編譯巨集,通過它來檢測當前編譯器是否使用的是c++編譯器。

C 中extern 的用法

前段時間看了extern 的用法,今天試了一下出現了如下問題,我在乙個標頭檔案1中定義了全域性常量,然後在標頭檔案2中定義了同樣的全域性變數,然後把兩個標頭檔案包含在另外乙個cpp裡面出現了了重新定義的錯誤,去掉頭檔案2中的全域性定義,undeclared identifier 的錯誤。最後把2中的...

C 中extern 的用法

前段時間看了extern 的用法,今天試了一下出現了如下問題,我在乙個標頭檔案1中定義了全域性常量,然後在標頭檔案2中定義了同樣的全域性變數,然後把兩個標頭檔案包含在另外乙個cpp裡面出現了了重新定義的錯誤,去掉頭檔案2中的全域性定義,undeclared identifier 的錯誤。最後把2中的...

C 中extern的用法

c 中extern 的用法1宣告外部實體 宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如 extern int ivalue 此時的extern 是必須的,省略了 extern 編譯器將視為定義而不是宣告,一般地在源 中定義變數並進行初始化,在標...