[英]What does the 'extern' keyword does that makes the following code legal?
為什么以下代碼會編譯? num變量何時獲得其值?
#include <stdio.h>
extern int num;
void main()
{
printf("%d", num); //prints 3
}
int num = 3;
示例: 實時代碼
在您的代碼中
extern int num;
被稱為聲明 。 太太
int num = 3;
是具有顯式初始化的定義。 該語句設置值。 該值在編譯時確定,並在main()
開始執行之前設置。
也就是說, void main()
應該是int main(void)
,至少要符合標准。
之所以起作用,是因為您已聲明num
以便可以在函數的代碼中對其進行命名,並且因為已在名稱空間范圍內對其進行了定義 ,以便在靜態初始化時(即在執行main
之前)對其進行初始化。
從這個意義上講,您當前編寫的程序與以下內容基本沒有區別:
#include <stdio.h>
int num = 3;
void main()
{
printf("%d", num); //prints 3
}
初始化變量的“位置”並不特別相關,只要在您嘗試使用變量之前及時進行初始化即可。
順便說一句,您必須使main
返回int
,而不是void
。
extern
標記了稍后定義的變量的聲明。 定義中, int num = 3;
部分是實際為變量分配內存並設置其值的內容(它也作為聲明的兩倍)。 C / C ++是在使用前聲明的,如果您沒有執行extern int num;
那么在使用時將不會聲明num
。 當然,您也可以刪除extern
行並將num
的定義上移到main()
以上。
這里有兩件事在起作用。 在編譯期間,必須在使用前在源文件中的一點聲明num
。 至於何時獲得它的值分配,這是在程序加載期間出現的。 文件范圍內(所有函數之外)的所有變量(如num
均已分配其內存,並且其值(如果在main()
調用之前進行了初始化main()
也已被分配。 如果在定義中未給它們賦值,則它們可能包含任何內容,因此不要對未初始化變量的值做任何假設。 您也不能對它們的初始化順序做任何假設,因此在初始化這樣的變量時不要引用其他文件作用域變量。
extern
與聲明一起使用。 它告訴編譯器該事物將在其他地方定義。 當您有多個文件使用相同的變量或函數時,此功能很有用。 您可以將extern
聲明放在頭文件中,並在源文件中定義共享變量/函數。
如果從代碼中刪除extern
,則將兩次定義num
,這是不允許的。 要擺脫extern
聲明,只需將您的int num = 3;
在文件的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.