2012-05-29 3 views
1

Я прочитал в статье «Думая на C++» Брюсом Экелем, что, когда компилятор 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

Название mangling предназначено только для * ссылки * - компилятор все еще знает все, что ему нужно знать о функциях внутри единицы компиляции. –

+0

Две функции не могут существовать с одними и теми же аргументами, но с разными типами возвращаемых данных, поэтому нет необходимости вводить возвращаемый тип. – Pubby

ответ

5

На этапе компоновки вступает в действие символ (а не только функции). Вы получаете ошибку компилятора.

Компилятор не видит искаженное имя. Он просто видит, что у вас есть функция, называемая func, которая возвращает int и не принимает никаких параметров, и поэтому может сообщить вам, что ваш код является незаконным.

5

Это ошибка компиляции.
Компилятор проверяет правильность работы программы на C++ в соответствии со стандартной спецификацией C++.

Почему компилятор сообщает об ошибке здесь?

Поскольку компилятор могут видеть, которые возвращают тип функции int и он используется для инициализации переменной типа std::string и не действует неявное преобразование для него.

Обратите внимание, что язык устроен таким образом, что позволяет компилятору делать такого рода проверки типов, C++ является statically typed language.

Смежные вопросы