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