C語言命名衝突問題

2021-08-08 22:29:55 字數 1538 閱讀 1225

首先講一下命名衝突的由來。c語言中所有的符號名稱都定義在乙個全域性命名空間中。這樣符號名稱,中間檔名稱(.o檔案或者.obj檔案)都可能會衝突。

根據我的經驗,如下情況下容易產生c語言命名衝突:

1、當系統只有乙個模組的時候,命名衝突的問題不太嚴重。當系統有n個模組之後,很難保證不發生命名衝突。如果**是我們自己編寫的,可以通過良好的程式設計習慣來避免這個問題。

2、但是如果你的系統中有多個開源庫的話,就非常容易產生命名衝突的問題了。因為這些開源庫是不同人編寫的,他們可能遵循的不同的命名規則。

3、另外一種非常容易產生命名衝突的情況是:如果你的系統有一部分是c語言實現的閉源的靜態庫或者動態庫(有可能是第三方提供的庫,或者是合作夥伴提供的庫),沒有原始碼,你就很難避免命名衝突了。

上文討論了產生c語言命名衝突的幾種常見情況,難免有遺漏,歡迎補充。那麼怎樣解決這些命名衝突問題呢?

對於第一種情況,解決比較簡單,因為所有的**都是自己開發的。只要制定嚴格的命名規則和開發人員具有良好的程式設計習慣就可以避免。

對於第二種情況,如果多個開源庫有命名衝突的話,沒有辦法只能修改開源庫的**,比較好的做法是定義巨集來完成符號的替換,這樣**改動最少,也易於維護。舉個例子說明這個問題,加入說系統中兩個開源庫中free函式命名衝突了,需要修改乙個庫的符號。怎樣實現呢?

1、首先定義乙個標頭檔案,假設為redefine.h,在標頭檔案中加入如下定義:

#define free my_free

2、然後在使用和定義free的原始檔中包含redefine.h標頭檔案。這樣庫中所有的free符號,全部變成了my_free,並且不需要修改開源庫的**。

對於第三種情況,就比較困難了,因為有一部分庫是沒有原始碼的。如果你的系統中只有乙個閉源的靜態庫或者動態庫。這個問題還是相對比較容易解決的。可以通過上面的辦法修改有原始碼的庫的符號。舉乙個比較極端的例子,假如閉源動態庫或者靜態庫中包含有某個庫(比如ligjpeg),那麼你的系統**中也有這個庫,那麼將會產生命名衝突。怎麼解決呢?你可能可以把自己的libjpeg拿掉,用靜態庫中的。靜態庫中的libjpeg**是看不到的,你不知道庫的提供者有沒有對其進行改變。所以比較能接受的做法還是用上面提到方法把你的系統用的的libjpeg的符號都重新定義一下。自己還是呼叫自己的libjpeg,不要依賴庫裡面的libjpeg。

如果你的系統中兩個閉源的庫命名衝突了,那麼你的麻煩就大了。只能想辦法修改乙個閉源庫,這可能涉及到其他部門的協調問題,開發人員不可控。

如果系統中有兩個相同的.o檔案(也就是系統中檔名衝突了,有兩個相同名稱的.c檔案)會有什麼結果呢?系統隨機link乙個.o到最終的目標檔案中,並且不會產生錯誤和警告提示。這種情況非常難發現。需要經驗和敏銳的洞察力。解決方法有兩個:

1、重新命名其中的乙個.c檔案。這樣就會產生不同的.o檔案,兩個.o檔案都會被link到最終的目標檔案中。

2、修改乙個庫的makefile檔案,讓其生成的.o檔案加乙個字首或者字尾(需要研究自己系統的makefile寫法)。

以上討論都是出於個人經驗,難免有所偏頗,請各位指正。

**:

C語言八皇后衝突問題

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述八皇后問題是在8 8的西洋棋的棋盤上放置8個皇后,有多少種不同的放置方法,要求它們互相都不衝突 衝突是指在某一行或者某一列或者某一條斜線上出現兩個皇后,因為這兩個皇后可以互相吃掉對方 其中行號和列號都從0開始。現在前三行 0 2...

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

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

jQuery命名庫衝突的問題

今天在使用jquery cookie時,其他時候都用的好好的,只有在 cookie這裡報錯了,原因說 cookie is not a function,而我是很明顯匯入了cookie庫的,所以我覺得應該是命名空間衝突的問題,於是我用以下辦法解決了問題 function var j jquery.no...