在函数内部重新定义函数

时间:2014-02-14 14:48:00

标签: c++

我偶然发现了一个奇怪的c ++片段。我认为这是错误的代码。为什么有人会在函数内重复函数声明?它甚至在将类型签名更改为unsigned int sum(int, int)时编译,产生预期结果4294967294j。为什么这甚至可以编译?

#include <iostream>
#include <typeinfo>

using namespace std;

int sum(int a, int b){
    return a + b;
}

int main()
{
    int sum(int, int); // redeclaring sum???
    int a = -1;
    auto result = sum(a, a);
    cout << result << typeid(result).name() << endl;
}

编辑:它为我编译......但它是有效的C ++代码吗?如果不是为什么编译器(mingw 4.8.1)允许它?

2 个答案:

答案 0 :(得分:6)

有时候在块范围内重新声明一个函数是有意义的。例如,如果要设置默认参数。请考虑以下代码

#include <typeinfo>

using namespace std;

int sum(int a, int b){
    return a + b;
}

int main()
{
    int sum(int, int = -1 ); // redeclaring sum???
    int a = -1;
    auto result = sum(a, a);
    cout << result << typeid(result).name() << endl;

    result = sum(a);
    cout << result << typeid(result).name() << endl;
}

另一种情况是,您希望从一组重载函数中调用具体函数。请考虑以下示例

#include <iostream>

void g( int ) { std::cout << "g( int )" << std::endl; }
void g( short ) { std::cout << "g( short )" << std::endl; }

int main()
{
   char c = 'c';
   g( c );

   {
      void g( short );
      g( c );
   }
}

答案 1 :(得分:2)

如果这是实际代码,则没有理由这样做。

如果函数sum在其他地方被定义,main内的声明只能在main内访问它。您不能在该翻译单元中的任何其他位置使用它(当然,除非您声明它)。因此,这是一种限制可见性的可见性,但是,被授予,它不是非常易读。

关于更改退货类型 - 这是非法的。您没有看到unsigned int的任何问题,但是如果您尝试

char sum(int, int); // redeclaring sum???
你会发现那里有问题。