C語言 命名衝突與static修飾符

2021-09-18 01:57:45 字數 956 閱讀 8945

整理自《c陷阱與缺陷》。

外部物件:

聯結器通常把目標模組看成是由一組外部物件組成的。每個外部物件代表著機器記憶體中的某個部分,並通過乙個外部名稱來識別。因此,程式中的每個函式和每個外部變數,如果沒有被宣告為static,就都是乙個外部物件。某些c編譯器會對靜態函式和靜態變數的名稱做一定改變,將它們也作為外部物件。

鏈結器的工作:

聯結器的輸入是一組目標模組和庫檔案。聯結器的輸出是乙個載入模組。聯結器讀入目標模組和庫檔案,同時生成載入模組。對每個目標模組中的每個外部物件,聯結器都要檢查載入模組,看是否已有同名的外部物件。如果沒有,聯結器就將該外部物件新增到載入模組中;如果有,聯結器就要開始處理命名衝突。

除了外部物件之外,目標模組還可能包括了對其他模組中的外部物件的引用。例如:乙個呼叫了函式printf的c程式所生成的目標模組,就包括了乙個對函式printf的引用。可以推測得出,該引用指向的是乙個位於某個庫檔案中的外部物件。在聯結器生成載入模組的過程中,它必須同時記錄這些外部物件的引用。當聯結器讀入乙個目標模組時,它必須解析出這個目標模組中定義的所有外部物件的引用,並作出標記說明這些外部物件不再是未定義的。

命名衝突:

static能有效減少此類命名衝突。

static修飾的函式和變數,作用域限制在同乙個原始檔裡,對於其他原始檔不可見。

因此,如果,如果若干函式需要共享一組外部變數,可以把這些函式放到同乙個原始檔裡,把需要用到的物件也在同乙個原始檔裡以static修飾符宣告。

例子:

static int g(int x)

void f()

我們可以在多個檔案定義同名函式g,只要所有函式都被定義為static,或者僅有乙個g函式不是static。

因為了避免可能出現的同名衝突,如果乙個函式僅被同乙個原始檔的函式呼叫,應該將其宣告為static。

C語言命名衝突問題

首先講一下命名衝突的由來。c語言中所有的符號名稱都定義在乙個全域性命名空間中。這樣符號名稱,中間檔名稱 o檔案或者.obj檔案 都可能會衝突。根據我的經驗,如下情況下容易產生c語言命名衝突 1 當系統只有乙個模組的時候,命名衝突的問題不太嚴重。當系統有n個模組之後,很難保證不發生命名衝突。如果 是我...

c語言之static 命名規則

作用一 修飾變數 區域性變數 在函式體內部定義的,這個變數只能在這個函式內使用,同一檔案的其它函式也沒法使用。它是儲存於靜態區的,即時函式執行結束了,靜態變數也不會銷毀,下次使用的時候任然可以用裡面的值。靜態區域性變數 裡面可以不用初始化,編譯器默認初始化為0。只進行唯一的 第一次 初始化。作用二 ...

C 命名空間與類名的衝突

今晚寫乙個聊天客戶端的程式,花了很長時間設計介面,然後在我定義p2pclient類的時候用到了類tcpclient,這是乙個有關收發資料的類,但是我定義專案名的時候用了tcpclient,這樣在我使用類tcpclient時,vs就總是提示錯誤,後來在給專案重新命名tcpclient,還修改專案屬性中...