2015-03-02 85 views
1

我试图在函数中看到默认参数提升。具体而言,我想测试第6.5.2.2节函数调用(描述为here)。函数默认参数提升

我想要一个无原型的函数调用,以查看默认参数提升为整数,但我得到“函数不带1个参数”错误。这是我想要做的:

#include<iostream> 
using namespace std; 

//void Func(char val); 
//void Func(int val); 
void Func(); // No prototype 

int main(int argc, char** argv) 
{ 
    char charVal = 'a'; 
    cout << "Func(charVal) - "; Func(charVal); 

    return 0; 
} 

void Func(char val) 
{ 
    cout << "Char arg. Result: " << val << endl; 
} 

void Func(int val) 
{ 
    cout << "Int arg. Result: " << val << endl; 
} 

我期望看到由于参数提升而被调用的函数(int)。 这是否已从标准中删除?

干杯。

P.S-我刚才看到这种无原型声明是C标准NOT C++的一部分。为什么C++不支持它的任何特定原因?

+4

只有'Func()'重载在范围内 - 一个采用零参数的重载。促销与此无关。如果其他重载在范围内,则会选择'Func(char)'重载。 – 0x499602D2 2015-03-02 15:08:09

回答

4

所有功能(以及一般命名实体)都需要在使用前进行声明。当您尝试使用main中的参数调用它时,您只声明了没有参数的重载(这是C++中空参数列表的含义)。

您在文件开头有正确的声明,但出于某种原因,您需要的声明已被注释掉。取消它们的注释并没有问题。

我刚才看到这种无原型声明是C标准NOT C++的一部分。为什么C++不支持它的任何特定原因?

因为C++支持重载。重载解析发生在编译时,调用函数的地方,只有编译器知道它们存在时才考虑候选项 - 也就是说,如果它们已经完全声明,以便编译器可以将它们的签名与参数类型相匹配函数调用。

在C中,编译器知道你的意思是哪个函数,它是否知道参数类型,因为它是唯一具有该名称的函数。这些声明仅仅是危险的,从参数类型中去除了类型检查,并为各种错误打开了大门。

2

C++从来不支持无原型函数声明。 C++中的空参数列表意味着没有参数,而不是缺乏原型。

原因是C++有类型安全的链接,如果你没有原型,那就不起作用。而C++具有类型安全的链接,因为这只是一个好主意并减少了错误。 (你可以阅读的C设计&演进++的更多细节。)用C

参数提升++只存在于调用真正的可变参数的功能,即那些在参数列表...声明。