簡體   English   中英

兩個相同名稱的靜態變量(兩個不同的文件)和其他任何文件中的外部變量

[英]Two static variables in same name(two different file) and extern one of them in any other file

在一個文件中將變量聲明為靜態並在另一個文件中執行extern聲明 - 我認為這會在鏈接時出錯,因為在任何對象中都不會看到extern變量,因為在其他文件中聲明的變量是靜態的。 但不知何故,鏈接器(瑞薩)沒有顯示任何錯誤並創建了可執行文件。

如果上面的用例是正確的,如果2個變量在2個不同的文件中聲明為靜態而另一個在另一個帶extern聲明的文件中會發生什么? 在這種情況下,將在2個不同的對象中創建2個不同的存儲器,但是哪個變量將被鏈接用於其他變量,在另一個文件中被聲明為extern(因為兩個變量名都相同)?

在file1.c

static int test_var;
fn1()
{
   test_var = 1;
}    

file2.c中

static int test_var;
fn2()
{
   test_var = 2;
}

file3.c中

extern int test_var;
fn3()
{
   int x;
   x = test_var;
}

在您的示例中, file3.c 絕對無法訪問file1.cfile2.c變量test_var 如果未在file3.c的范圍內聲明test_var則應該收到鏈接錯誤。

答案可能是您已配置鏈接器的方式。 如果您正在鏈接庫,那么這里的一切都會正常, file3.o模塊將test_var引用為UNDEFINED

如果您要連接這3個模塊的應用程序,那么您將失敗,因為缺少main()例程定義和未解析的外部將被視為更不邪惡。 :-)

要檢查它,請在構建過程中檢查相應的*.o模塊符號表,然后檢查最終結果。 有這樣的方法,你會發現你的奇怪的構建行為的原因。

在file1.c和file2.c中,關鍵字static表示變量test_var文件范圍 這意味着此變量只能在聲明它的文件中訪問。

在file3.c中,關鍵字extern表示該變量在其他文件中聲明。

當編譯器編譯file3.c時,它會將變量test_var標記在其他目標文件中,並不關心它在哪里。 因此可以編譯此文件,並且不會發生錯誤。 但是當鏈接器處理此對象文件時,它會發現沒有名為test_var變量可以鏈接到file3,將顯示錯誤。

暫無
暫無

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

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