[英]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 };
之前和之后應該有#ifndef
和endif
const struct puppy fido = { "fido", 10, 10 };
為了包括一次。
一個好的做法 (通常必須避免全局變量)是在.h文件中用extern
聲明,並將變量的定義放入.c文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.