2017-02-19 18 views
2

正如標題所要求的那樣,C++和C在鏈接過程中使用同一種鏈接器嗎?另外,對於C++和C編譯器,C++編譯器是否構建在C編譯器上?C++和C使用相同類型的鏈接器嗎?

+0

鏈接根本不是編譯過程的一部分。鏈接是一個完全不同的過程,並且在編譯完成後發生。如果C++編譯器構建在C編譯器之上,或者它是從頭開始構建的,則取決於我們所討論的編譯器。他們中的很多人都是封閉的,所以我們沒有一種直接的瞭解方式。另外,這不是C++或C的問題。 –

+2

至於gnu編譯器套件:是的,gcc和g ++使用相同的鏈接器:ld – Ctx

+0

@VadaPoché爲什麼這不是C++或C的問題?這不是關於代碼,它不是關於編譯,而是不鏈接大多數代碼,大多數編譯都是無用的。 Imho的標籤在這裏完全相關 – user463035818

回答

6

兩個實現都使用相同的鏈接器。但是,爲了支持函數重載,C++必須對鏈接事件的名稱和類型進行編碼,以便它們不能與錯誤的函數鏈接。所以,如果你有兩個C++函數是這樣的:

void func(int); 
void func(int, double); 

那麼C++編譯器會爲這些功能類似func_intfunc_int_double名。具體生成的名稱是編譯器特定的,並且不是由C++標準指定的。因爲C不支持重載,所以在C中不需要這樣的機制,但是如果要將C++代碼鏈接到C,這就是extern "C"構造所做的事情,但您需要關閉這種所謂的名稱重組。