我們有兩個文件,foo.c和bar.c。
這是foo.c
#include <stdio.h>volatile unsigned int stop_now = 0;extern void bar_function(void);int main(void){
while (1) {
bar_function();
stop_now = 1;
}
return 0;}
現(xiàn)在,這里是bar.c
#include <stdio.h>extern volatile unsigned int stop_now;void bar_function(void){
while (! stop_now) {
printf("Hello, world!\n");
sleep(30);
}}
正如您所看到的,我們在foo.c和bar.c之間沒有共享的頭,但是bar.c在鏈接時需要在foo.c中聲明一些東西,而foo.c在鏈接時需要來自bar.c的函數(shù)。
通過使用“extern”,您是在告訴編譯器,在鏈接時將找到任何跟隨它的東西(非靜態(tài)的);不要在當前傳遞中為它保留任何東西,因為以后會遇到它。在這方面,函數(shù)和變量受到平等對待。
如果您需要在模塊之間共享一些全局的,并且不想將它放在/初始化一個頭中,那么它是非常有用的。
從技術上講,庫公共頭中的每個函數(shù)都是“extern”,但是根據(jù)編譯器的不同,將它們標記為“extern”幾乎沒有什么好處。大多數(shù)編譯器可以自己解決這個問題。正如您所看到的,這些函數(shù)實際上是在其他地方定義的。
在上面的示例中,main()只打印Hello World一次,但是繼續(xù)輸入bar_function()。還請注意,在這個示例中,bar_function()不會返回(因為它只是一個簡單的示例)。想象一下,當信號被服務(因此是易失性的)時,STOP_NOW被修改,如果這看起來不夠實用的話。
Externs對于諸如信號處理程序、不想放入頭或結構等的互斥對象非常有用。大多數(shù)編譯器將進行優(yōu)化,以確保它們不為外部對象保留任何內(nèi)存,因為它們知道它們將在定義對象的模塊中保留它。然而,在構建公共函數(shù)的原型時,用現(xiàn)代編譯器來指定它也沒有什么意義。
希望有幫助:)