詳解C語言正確使用extern關(guān)鍵字
利用關(guān)鍵字extern,可以在一個(gè)文件中引用另一個(gè)文件中定義的變量或者函數(shù),下面就結(jié)合具體的實(shí)例,分類說明一下。
一、引用同一個(gè)文件中的變量
#include<stdio.h>
int func();
int main()
{
func(); //1
printf("%d",num); //2
return 0;
}
int num = 3;
int func()
{
printf("%d\n",num);
}
如果按照這個(gè)順序,變量 num在main函數(shù)的后邊進(jìn)行聲明和初始化的話,那么在main函數(shù)中是不能直接引用num這個(gè)變量的,因?yàn)楫?dāng)編譯器編譯到這一句話的時(shí)候,找不到num這個(gè)變量的聲明,但是在func函數(shù)中是可以正常使用,因?yàn)閒unc對(duì)num的調(diào)用是發(fā)生在num的聲明和初始化之后。
如果我不想改變num的聲明的位置,但是想在main函數(shù)中直接使用num這個(gè)變量,怎么辦呢?可以使用extern這個(gè)關(guān)鍵字。像下面這一段代碼,利用extern關(guān)鍵字先聲明一下num變量,告訴編譯器num這個(gè)變量是存在的,但是不是在這之前聲明的,你到別的地方找找吧,果然,這樣就可以順利通過編譯啦。但是你要是想欺騙編譯器也是不行的,比如你聲明了extern int num;但是在后面卻沒有真正的給出num變量的聲明,那么編譯器去別的地方找了,但是沒找到還是不行的。
下面的程序就是利用extern關(guān)鍵字,使用在后邊定義的變量。
#include<stdio.h>
int func();
int main()
{
func(); //1
extern int num;
printf("%d",num); //2
return 0;
}
int num = 3;
int func()
{
printf("%d\n",num);
}
二、引用另一個(gè)文件中的變量
如果extern這個(gè)關(guān)鍵字就這點(diǎn)功能,那么這個(gè)關(guān)鍵字就顯得多余了,因?yàn)樯线叺某绦蚩梢酝ㄟ^將num變量在main函數(shù)的上邊聲明,使得在main函數(shù)中也可以使用。
extern這個(gè)關(guān)鍵字的真正的作用是引用不在同一個(gè)文件中的變量或者函數(shù)。
main.c
#include<stdio.h>
int main()
{
extern int num;
printf("%d",num);
return 0;
}
b.c
#include<stdio.h>
int num = 5;
void func()
{
printf("fun in a.c");
}
例如,這里b.c中定義了一個(gè)變量num,如果main.c中想要引用這個(gè)變量,那么可以使用extern這個(gè)關(guān)鍵字,注意這里能成功引用的原因是,num這個(gè)關(guān)鍵字在b.c中是一個(gè)全局變量,也就是說只有當(dāng)一個(gè)變量是一個(gè)全局變量時(shí),extern變量才會(huì)起作用,向下面這樣是不行的。
mian.c
#include<stdio.h>
int main()
{
extern int num;
printf("%d",num);
return 0;
}
b.c
#include<stdio.h>
void func()
{
int num = 5;
printf("fun in a.c");
}
另外,extern關(guān)鍵字只需要指明類型和變量名就行了,不能再重新賦值,初始化需要在原文件所在處進(jìn)行,如果不進(jìn)行初始化的話,全局變量會(huì)被編譯器自動(dòng)初始化為0。像這種寫法是不行的。
extern int num=4;
但是在聲明之后就可以使用變量名進(jìn)行修改了,像這樣:
#include<stdio.h>
int main()
{
extern int num;
num=1;
printf("%d",num);
return 0;
}
如果不想這個(gè)變量被修改可以使用const關(guān)鍵字進(jìn)行修飾,寫法如下:
mian.c
#include<stdio.h>
int main()
{
extern const int num;
printf("%d",num);
return 0;
}
b.c
#include<stdio.h>
const int num=5;
void func()
{
printf("fun in a.c");
}
使用include將另一個(gè)文件全部包含進(jìn)去可以引用另一個(gè)文件中的變量,但是這樣做的結(jié)果就是,被包含的文件中的所有的變量和方法都可以被這個(gè)文件使用,這樣就變得不安全,如果只是希望一個(gè)文件使用另一個(gè)文件中的某個(gè)變量還是使用extern關(guān)鍵字更好。
三、引用另一個(gè)文件中的函數(shù)
extern除了引用另一個(gè)文件中的變量外,還可以引用另一個(gè)文件中的函數(shù),引用方法和引用變量相似。
mian.c
#include<stdio.h>
int main()
{
extern void func();
func();
return 0;
}
b.c
#include<stdio.h>
const int num=5;
void func()
{
printf("fun in a.c");
}
這里main函數(shù)中引用了b.c中的函數(shù)func。因?yàn)樗械暮瘮?shù)都是全局的,所以對(duì)函數(shù)的extern用法和對(duì)全局變量的修飾基本相同,需要注意的就是,需要指明返回值的類型和參數(shù)。
以上所述是小編給大家介紹的C語言正確使用extern關(guān)鍵字詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C++中常見容器類的使用方法詳解(vector/deque/map/set)
C++中常見的容器類有vector、list、deque、map、set、unordered_map和unordered_set。下面將舉例直接說明各個(gè)容器的使用方法,希望對(duì)大家有所幫助2023-03-03
C++小游戲教程之猜數(shù)游戲的實(shí)現(xiàn)
這篇文章主要和大家詳細(xì)介紹如何利用C++做一個(gè)簡(jiǎn)易的猜數(shù)游戲,分為用戶猜數(shù)和系統(tǒng)猜數(shù)。文中的示例代碼講解詳細(xì) ,感興趣的小伙伴可以嘗試一下2022-11-11
C語言實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C++?STL標(biāo)準(zhǔn)庫(kù)之std::list使用介紹及用法詳解
std::list是支持常數(shù)時(shí)間從容器任何位置插入和移除元素的容器,下面這篇文章主要給大家介紹了關(guān)于C++?STL標(biāo)準(zhǔn)庫(kù)之std::list使用介紹及用法詳解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

