2012-05-29 28 views
1

我在C++的Thinking in C++中閱讀了Bruce Eckel,當C++編譯器遇到函數時,它使用它的名稱和參數來修飾它的名稱。 對於函數,int func(char ch);它將裝飾它的名稱爲_func_char它不使用返回類型。通過編譯器進行函數返回類型驗證

在這種情況下, 在下面的程序中,當函數名裝飾過程中沒有存儲返回類型時,編譯器如何抱怨「int無效轉換爲const char *」?任何人都可以澄清?

#include <iostream> 

using namespace std; 

int func() 
{ 
    int i = 5; 
    return i; 
} 

int main() 
{ 
    string str = func(); 
} 
+0

http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B – v01d

+4

名稱修改僅用於*鏈接* - 編譯器仍然知道它需要了解編譯單元中函數的所有信息。 –

+0

兩個函數不能以相同的參數存在,但返回類型不同,因此不需要在返回類型中進行分解。 – Pubby

回答

5

在鏈接階段符號(不只是函數)名稱的變形發揮作用。你得到一個編譯器錯誤。

編譯器看不到重名的名稱。它只是看到你有一個叫func的函數返回一個int並且不帶任何參數,所以可以告訴你你的代碼是非法的。

5

這是一個編譯錯誤。
編譯器根據C++標準規範檢查C++程序的有效性。

爲什麼編譯器在這裏報錯?

由於編譯器可以看到返回該功能的類型是int並且它被用來初始化類型std::string的變量並且對於它沒有有效的隱式轉換。

請注意,語言被設計以這樣一種方式,它允許編譯器做這些類型的類型檢查,C++是一個statically typed language