由一次奇怪的編譯出錯想起的

2021-06-17 17:03:20 字數 1165 閱讀 2041

最近在工作中遇到了一次奇怪的編譯出錯。事情是這樣的,本來這個asp.net webform應用是可以編譯的。但是將另外乙個class library的工程加入到這個asp.net webform應用的引用中,還未改任何其它的**。這個asp.net webform應用就出現了編譯錯誤。分析這些編譯出錯的地方,再看了svn歷史,這些檔案最近都沒有改過(最近一次改動是六月的事情了),但是這些檔案確實是編譯有錯。有點奇怪。一時想不出來為什麼。等到第二天,繼續分析,突然發現引起編譯出錯的型別是屬於這個新加入引用的工程。看了編譯出錯的**,其並沒有引入任何新加入引用的工程任何命名空間。這就奇怪了。還沒有引入其任何命名空間,只是把引用剛加上就出了編譯出錯。這個asp.net webform工程原來是可以編譯的,為什麼會加入乙個引用後就不能編譯了呢?會不會去掉引用還是能編譯?於是試著去掉了這個新加的引用。編譯。果然可以編譯。之前出錯的地方不再出錯了。看了一下那些之前出錯的型別,發現居然是另外一些在本來asp.net webform工程裡的一些類,並不是新加工程裡的類。而且這些類都有命名空間。這就奇怪了,為什麼加入引用之後,這些類就變成了新加工程裡的類呢?開啟了新加工程裡的類,仔細看了一下,發現了乙個問題,即該類沒有定義命名空間,同時該類的名字與asp.net webform工程裡的類同名。這就是為什麼這些沒有命名空間的類會引起編譯錯誤的原因了。當.net compiler定位乙個類時,如果有兩個類同名,乙個類有命名空間,另乙個沒有。.net compiler優先搜尋沒有命名空間的類,然後再去搜尋有命名空間的類。原來的程式引用的是有命名空間的類,沒有加入新引用時一切都沒有問題。當加入引用時,而且新的類沒有命名空間,剛好可以把原來的有命名空間的類替換掉。.net compiler優先搜尋到這個沒有命名空間的類,從而引起原來的程式出錯。因為原來有命名空間的類已經變了,換成這個沒有命名空間的類。既然找到了原因,那麼解決辦法就簡單了。

原因已經清楚了。解決辦法包括:

1. 給那些沒有命名空間的類加上命名空間

這個在實際情況中無法做到,這個新工程是由專人負責的。不能去改。

2. 給現有**強行加上全命名空間+類名的引用方式

這種辦法技術上是可行,但是會引起**看起來很恐怖。也不打算採用。

3. 實際的解決方式:

給那位專人指出這個問題,然後去掉對新工程的引用。因為其引起已有工程編譯出錯。然後在已有工程裡照搬了新工程裡幾個類,寫了一些mock up(假的實現)。等那位專人解決這個問題之後再進行合起來的編譯。

編譯出錯的可能情況

編譯器的一部分工作是尋找程式文字中的錯誤。編譯器沒有能力檢查乙個程式是否 按照其作者的意圖工作,但可以檢查形式 form 上的錯誤。下面列出了一些最常見的 編譯器可以檢查出的錯誤。語法錯誤 syntax error 程式設計師犯了c 語言文法上的錯誤。下面程式展示了一些常 見的語法錯誤 每條注釋描述...

莫名其妙的編譯出錯

今天真是遇到鬼了,之前好好的專案,做了些許修改,在debug下一切正常,但在release下無法通過編譯,明顯是某標頭檔案沒有被包含進來。我到出問題的cpp裡再次包含這個標頭檔案,編譯通過了。但絲毫沒有讓我覺得放鬆,問題還得找!我懷疑是某些空格或者換行出了問題,但一行一行處理之後問題不但沒有解決,反...

編譯出錯 程式中有游離的 302

編者按 複製別人的 到linux中執行,在編譯時出錯 錯誤 程式中有游離的 302 查詢資料後獲取解決方法,在此做乙個記錄。錯誤提示如下 read.c 164 6 錯誤 程式中有游離的 302 read.c 164 6 錯誤 程式中有游離的 302 read.c 164 6 錯誤 程式中有游離的 3...