c语言中external,static关键字用法
static用法:
在C中,static主要定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù)。
1、定義全局靜態(tài)變量:在全局變量前面加上關(guān)鍵字static,該全局變量變成了全局靜態(tài)變量。全局靜態(tài)變量有以下特點(diǎn)。
a.在全局區(qū)分配內(nèi)存。
b.如果沒有初始化,其默認(rèn)值為0.
c.該變量在本文件內(nèi)從定義開始到文件結(jié)束可見。
2、定義局部靜態(tài)變量:在局部變量前面加上關(guān)鍵字static,其特點(diǎn)如下:
a.該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存。
b.它始終駐留在全局?jǐn)?shù)據(jù)區(qū),直到程序運(yùn)行結(jié)束。
c. 其作用域?yàn)榫植孔饔糜?#xff0c;當(dāng)定義它的函數(shù)或語(yǔ)句塊結(jié)束時(shí),其作用域隨之結(jié)束。
3、定義靜態(tài)函數(shù):在函數(shù)返回類型前加上static關(guān)鍵字,函數(shù)即被定義為靜態(tài)函數(shù),其特點(diǎn)如下:
a.靜態(tài)函數(shù)只能在本源文件中使用
b.在文件作用域中聲明的inline函數(shù)默認(rèn)為static類型
總結(jié):用static定義的全局和局部靜態(tài)變量的區(qū)別是,全局的靜態(tài)變量的作用域和可見域都是從文件的定義開始到整個(gè)文件結(jié)束;而局部的靜態(tài)變量可見域是從文件的定義開始到整個(gè)文件結(jié)束,作用域是從該語(yǔ)句塊的定義開始到該語(yǔ)句塊結(jié)束
extern的用法:
1、聲明一個(gè)全局(外部)變量
當(dāng)用extern聲明一個(gè)全局變量的時(shí)候,首先應(yīng)明確一點(diǎn):extern的作用范圍是整個(gè)工程,也就是說當(dāng)我們?cè)?h文件中寫了extern int a;鏈接的時(shí)候鏈接器會(huì)去其他的.c文件中找有沒有int a的定義,如果沒有,鏈接報(bào)錯(cuò);當(dāng)extern int a;寫在.c文件中時(shí),鏈接器會(huì)在這個(gè).c文件該聲明語(yǔ)句之后找有沒有int a的定義,然后去其他的.cpp文件中找,如果都找不到,鏈接報(bào)錯(cuò)。值得注意的一點(diǎn):當(dāng)extern語(yǔ)句出現(xiàn)在頭文件中時(shí),不要將聲明和定義在一條語(yǔ)句中給出,也就是不要在頭文件中寫類似于這樣的語(yǔ)句:
extern int a = 1;這種寫法,在gcc編譯時(shí)會(huì)給出一個(gè)警告:warning: ‘a(chǎn)’ initialized and declared ‘extern’
注意:external聲明和定義的區(qū)別,定義只有一次,但是聲明沒有限制
int a; —>定義,默認(rèn)為0(等效于int a = 0;)
extern int a; —>聲明外部變量
extern int a = 1; —>定義性聲明(即在定義的同時(shí)聲明為全局變量),一般不提倡
比如:
頭文件a.h:
extern int a = 1;
頭文件b.h:
#include “a.h”
…
源文件test.c:
#include “a.h”
#include “b.h”
…
這樣肯定會(huì)報(bào)錯(cuò):會(huì)報(bào)錯(cuò)說變量a重復(fù)定義
所有一般(提倡)的做法是:
只在頭文件中通過extern給出全局變量的聲明(即external int a; 而不要寫成external int a = 1;),并在源文件中給出定義(并且只能定義一次)
比如:
頭文件a.h:
…
源文件1.c:
#include “a.h”
int a = 0; —>定義
頭文件b.h:
extern int a; —>聲明
源文件2.c:
#include <stdio.h>
#include “2.h”
void print()
{
printf(“a = %d\n”, a);
}
源文件main.c
#include “1.h”
#include “2.h”
int main()
{
print();
return 0;
}
2、extern “C” { /用C實(shí)現(xiàn)的內(nèi)容(通常寫在另外的.c文件中)/ }
C++完全兼容C,當(dāng)extern與“C”連用時(shí),作用是告訴編譯器用C的編譯規(guī)則去解析extern “C”后面的內(nèi)容。最常見的差別就是C++支持函數(shù)重載,而標(biāo)準(zhǔn)C是不支持的。如果不指明extern “C”,C++編譯器會(huì)根據(jù)自己的規(guī)則在編譯函數(shù)時(shí)為函數(shù)名加上特定的后綴以區(qū)別不同的重載版本,而如果是按C的標(biāo)準(zhǔn)來編譯的話,則不需要。
static和external定義的全局變量區(qū)別:
注意:用static定義的全局靜態(tài)變量可以被模塊內(nèi)所有的函數(shù)訪問,但不能被模塊外其他函數(shù)訪問。而用external定義的全局
1、static修飾全局變量時(shí),聲明和定義是同時(shí)給出的;而extern一般是定義和聲明分開,且定義只能一次
2、static的全局作用域只是自身編譯單元(即一個(gè).c文件以及這個(gè).c文件所包含的.h文件);而extern的全局作用域是整個(gè)工程(一個(gè)工程可以包含很多個(gè).h和.c文件)。即區(qū)別就在于“全局”的范圍是整個(gè)工程,還是自身編譯單元。
總結(jié)
以上是生活随笔為你收集整理的c语言中external,static关键字用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序出现 ld returned 1 e
- 下一篇: 用伪代码模拟洗衣机的运转流程