我在Bruce Eckel的Thinking in 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 :(得分:5)
符号(不仅仅是函数)名称修改在链接阶段发挥作用。您收到编译错误。
编译器没有看到错位的名称。它只是看到你有一个名为func
的函数,它返回int
并且没有参数,因此可以告诉你你的代码是非法的。
答案 1 :(得分:5)
这是编译错误 编译器根据C ++标准规范检查C ++程序的有效性。
为什么编译器会在此处报告错误?
因为编译器 可以看到 ,函数的返回类型是int
,并且它用于初始化std::string
类型的变量并且没有有效的隐式转换。
请注意,语言的设计方式允许编译器进行这类类型检查,C ++是 statically typed language 。