在函数内重新声明函数

Redeclaring a function inside a function

本文关键字:函数 声明 新声明      更新时间:2023-10-16

我偶然发现了一个奇怪的 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)允许它?

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

#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 );
   }
}

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

但是,如果函数sum是在其他地方定义的,则main中的声明使其只能在main内部访问。您不能在该翻译单元的其他任何地方使用它(除非您当然声明它)。因此,这是一种将可见性限制在需要的地方,但是,当然,它的可读性不是很强。

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

char sum(int, int); // redeclaring sum???

你会看到那里有问题。