簡體   English   中英

使以下代碼合法的'extern'關鍵字是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM