簡體   English   中英

在與定義相同的文件中使用extern聲明的好處?

[英]Benefits of using extern declaration in same file as definition?

我正在閱讀C項目的源代碼,並試圖辨別為什么要使用extern的特定用法。 (注意: 這個問題是相關的,但對於C ++,不是C。)說我有四個頭文件,每個頭文件都聲明一個extern const結構:

extern const struct puppy fido;

該結構在源文件中定義如下:

extern const struct puppy fido;
static const struct puppy *puppies[] = { &fido };
const struct puppy fido = { "fido", 10, 10 };

當在相同的源文件中定義變量聲明時,在源文件中將變量聲明標記為extern有什么好處?

唯一的好處是,聲明和定義之間的任何代碼都將能夠訪問該變量。 除此之外,同一文件中的extern聲明毫無意義。

Lundin是正確的,在這種情況下, extern不會影響fido在其他源文件中的可見性。 在示例代碼中,它用作前向聲明。

C99標准第6.2.2節的相關部分:

4)對於在可見該標識符的先前聲明的范圍內用存儲類說明符extern聲明的標識符,如果該先前聲明指定了內部或外部鏈接,則該標識符在后面的聲明中的鏈接與先前聲明中指定的鏈接。 如果沒有在先聲明可見,或者在先聲明沒有指定鏈接,則標識符具有外部鏈接。

5) 如果函數標識符的聲明沒有存儲類說明符,則將其鏈接確定為與使用存儲類說明符extern聲明的完全相同。 如果對象的標識符聲明具有文件范圍且沒有存儲類說明符,則其鏈接是外部的

在C ++中,行為會有所不同,因為用const聲明的變量是隱式static 在C ++中,您需要在第一次使用extern聲明變量,否則其他編譯單元將找不到它。

C ++ 98標准第3.5.3節:

具有名稱空間范圍(3.3.5)的名稱如果具有以下名稱,則具有內部鏈接:

—明確聲明為靜態的對象,引用,函數或函數模板,或者,

—一個對象或引用,該對象或引用被顯式聲明為const,並且既未顯式聲明為extern,也未先前聲明為具有外部鏈接;

有時,當您編寫源文件時,您只需要一個頭文件,而不是整個文件。

在源文件中重復extern聲明,可以使您不將頭文件包括在該特定源文件中。

這不一定是一個好習慣。

extern const struct puppy fido;
// ...
const struct puppy fido = { "fido", 10, 10 };

如果const struct puppy fido = { "fido", 10, 10 }; 在2個不同的.c文件中編譯,它將失敗。 const struct puppy fido = { "fido", 10, 10 };之前和之后應該有#ifndefendif const struct puppy fido = { "fido", 10, 10 }; 為了包括一次。

一個好的做法 (通常必須避免全局變量)是在.h文件中用extern聲明,並將變量的定義放入.c文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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