函数中的默认参数提升

时间:2015-03-02 15:05:59

标签: c++ arguments

我正试图在函数中看到默认参数提升。具体来说,我想测试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;
}

由于参数提升,我希望看到Func(int)被调用。 这已经从标准中删除了吗?

干杯。

P.S-我刚看到这种无原型声明是C标准的一部分,而不是C ++。 C ++不支持它的任何特殊原因?

2 个答案:

答案 0 :(得分:4)

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

您在文件的开头有正确的声明,但由于某种原因,您需要的声明被注释掉了。取消注释它们就可以了。

  

我刚看到这种无原型声明是C标准的一部分,而不是C ++。 C ++不支持它的任何特殊原因?

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

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

答案 1 :(得分:2)

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

原因是C ++具有类型安全链接,如果你没有原型,它就不起作用。 C ++具有类型安全链接,因为这只是一个好主意并减少了错误。 (您可以阅读C ++的Design&amp; Evolution以获取更多详细信息。)

C ++中的参数提升仅存在于对真正的可变参数函数的调用中,即在参数列表中使用...声明的函数。