我偶然发现了一个奇怪的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)允许它通过?
int sum(int,int); int sum(int,int); int sum(int,int); int sum(int,int);
是合法的C++代码,并且需要这样才能允许前向声明。但是对我来说不太合理的是类型改变不仅可以接受,而且没有选择不同的名称... - IdeaHataa ss = sum(d,e);
,它会编译并运行。 - IdeaHatfloat
,您会得到奇怪的结果。我认为这违反了ODR规则。 - jrokfloat sum(...)
遮蔽了int sum(...)
,因此result
的类型被推断为float
。但是当链接器寻找sum(int, int)
时,它会忽略返回类型,并链接int
版本,因为它是唯一可用的定义。在 x86 上返回值的方式是将int
放入特定的寄存器中。调用者将该寄存器原封不动地复制到result
中,从而将float
重新解释为int
。总的来说,这几乎肯定是未定义行为和不可移植的。 - Nicu Stiurca