C語言extern關鍵字用法和理解

原文鏈接:https://blog.csdn.net/qq_27664167/article/details/82859852

extern表明變量或者函數是定義在其他其他文件中的

例如:extern int a;

顯式的說明了a的存儲空間是在程序的其他地方分配的,在文件中其他位置或者其他文件中尋找a這個變量。

 

用法

  • 一個c文件需要調用另一個c文件裏的變量或者函數,而不能從.h文件中調用變量。詳見下文1
  • extern int a = 5與int a = 5意義是一樣的,都是定義。而extern int a;是聲明。但會產生一條警告。詳見下文2
  • 對於函數而言,和引用變量是一樣的,如果需要調用其他.c文件中的函數,在文件中的函數聲明前加extern即可,不加extern而直接聲明函數也可以,因爲聲明全局函數默認前面帶有extern。詳見下文3
  • 如果不想讓其他.c文件引用本文件中的變量,加上static即可。詳見下文4

 

建議最優用法

例如a.c文件中定義int a = 5和一個函數,在a.h裏寫extern int a;,如果要在其他文件裏調用a這個變量和函數,直接#include<a.h>即可。如下圖

 

1.一個c文件需要調用另一個c文件裏的變量或者函數,而不能從.h文件中調用變量

只能引用另外一個.c文件裏的變量或者函數,不能引用.h文件裏的變量,當然,也非常不建議在.h文件裏定義變量。因爲在.h文件裏定義變量,如果這個.h文件被多個.c文件包含則會報重複定義的錯誤,文章末尾詳講。

例1:在a.h文件中定義一個變量,在b.c文件中引用,會報錯,未定義這個變量

例2:在a.c文件中定義一個變量,在b.c文件中引用,成功調用

 

2.extern int a = 5與int a = 5意義是一樣的,都是定義。而extern int a;是聲明。但會產生一條警告

例1:在a.h文件中使用extern int a = 5定義一個變量,在b.c文件中引用,會報warning,但程序可以運行

 

3.引用函數

引用變量是一樣的,如果需要調用其他.c文件中的函數,在文件中的函數聲明前加extern即可,不加extern而直接聲明函數也可以,因爲聲明全局函數默認前面帶有extern。見下面例子

例1:a.c中定義一個fun函數,b.c中要引用這個函數,b.c中的聲明extern int fun(); 與int fun();沒有任何區別,如下兩個圖

 

4.如果不想讓其他.c文件引用本文件中的變量,加上static即可

static 表示靜態的變量,限制此變量作用域在一個源文件內,其他文件不能用extern來引用此變量,不僅適用於變量,函數也可以。如下圖例子,b.c文件就不能引用a.c文件裏的靜態變量ckx。

 

5.extern和include的區別

include相當於把include .h文件直接帶入到本源文件裏,比如在b.c文件裏include "a.h",就相當於把a.h文件裏所有定義的變量和函數全部拷貝了一份放入了b.c裏,一個項目裏,一個.h文件可能會被多個.c源文件包含,這樣編譯的時候就會報重複定義的錯誤。而且儘量不要在.h裏定義變量,這是一個不好的習慣。

例子:在a.h裏定義一個變量,a.c和b.c都包含這個.h文件,編譯的時候就會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章