C語言的定義與宣告

2021-06-18 03:14:22 字數 1988 閱讀 5129

1.變數的定義&宣告

變數的宣告有兩種情況:

<1>一種是需要建立儲存空間的。例如:int a 在宣告的時候就已經建立了儲存空間。

<2>另一種是不需要建立儲存空間的。 例如:extern int a 其中變數a是在別的檔案中定義的。

前者是「定義性宣告(defining declaration)」或者稱為「定義(definition)」,而後者是「引用性宣告(referncing declaration)」。

從廣義的角度來講宣告中包含著定義,即定義是宣告的乙個特例,所以並非所有的宣告都是定義,例如:int a 它既是宣告,同時又是定義。然而對於 extern a 來講它只是宣告不是定義。

一般的情況下我們常常這樣敘述,把建立空間的宣告稱之為「定義」,而把不需要建立儲存空間的宣告稱之為「宣告」。很明顯我們在這裡指的宣告是範圍比較窄的,即狹義上的宣告,也就是說非定義性質的宣告,例如:在主函式中:

intmain()

int a; //是定義,定義了a為整型的外部變數

外部變數的「定義」與外部變數的「宣告」是不相同的,外部變數的定義只能有一次,它的位置是在所有函式之外,而同乙個檔案中的外部變數宣告可以是多次的,它可以在函式之內(哪個函式要用就在那個函式中宣告)也可以在函式之外(在外部變數的定義點之前)。系統會根據外部變數的定義(而不是根據外部變數的宣告)分配儲存空間的。對於外部變數來講,初始化只能是在「定義」中進行,而不是在「宣告」中。所謂的「宣告」,其作用,是宣告該變數是乙個已在後面定義過的外部變數,僅僅是為了「提前」引用該變數而作的「宣告」而已。extern 只作宣告,不作任何定義。

(我們宣告的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨宣告的必要,變數是如此,函式也是如此,所以宣告不會分配儲存空間,只有定義時才會分配儲存空間。)

例子:int i1 = 1; // definition, external linkage

static int i2 = 2; // definition, internal linkage

extern int i3 = 3; // definition, external linkage

int i4; // tentative definition, external linkage

static int i5; // tentative definition, internal linkage

int i1; // valid tentative definition, refers to previous

int i2; // 6.2.2 renders undefined, linkage disagreement

int i3; // valid tentative definition, refers to previous

int i4; // valid tentative definition, refers to previous

int i5; // 6.2.2 renders undefined, linkage disagreement

extern int i1; // refers to previous, whose linkage is external

extern int i2; // refers to previous, whose linkage is internal

extern int i3; // refers to previous, whose linkage is external

extern int i4; // refers to previous, whose linkage is externalextern

變數i2和i5第一次宣告為internal linkage,第二次又宣告為external linkage,這是不允許的,編譯器會報錯。注意上表中標有[*]的單元格,對於檔案作用域的extern變數宣告,c99是允許帶initializer的,並且認為它是乙個定義,但是gcc對於這種寫法會報警告,為了相容性應避免這種寫法。

C語言的宣告與定義

keil的專案中,遇到呼叫其他c檔案函式和變數的情況 對於函式,在a.c下面進行編寫,之後在a.h下面進行宣告,其他檔案包含a.h即可呼叫。對於變數,在a.c下面進行定義,在a.h下面也要進行一下宣告,其他檔案使用此變數時,包含a.h即可使用。關於變數的定義與宣告 變數定義即為變數分配儲存空間,也可...

C語言宣告與定義

很久沒接觸c語言了,今天遇到宣告與定義的問題,於是找到下面的解釋 宣告 declaration 指定了乙個變數的識別符號,用來描述變數的型別,是型別還是物件,或者函式等。宣告,用於編譯器 compiler 識別變數名所引用的實體。以下這些就是宣告 extern int bar extern int ...

C語言解惑「定義」 與 「宣告」

所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和這塊記憶體匹配起來,它們就同生共死,終生不離不棄。並且這塊記憶體的位置也不能被改變。乙個變數或物件在一定的區域內 比如函式內,全域性等 只能被定義一次,如...