我偶然发现了一个奇怪的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)允许它?
答案 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???
你会发现那里有问题。