1
7
根据8.3.5.6,这应该很好:“非定义函数声明的参数类型或返回类型可能是不完整的类类型。” |
2
3
我想我也有同样的问题。 它发生在 小返回值类型 和 标题包含的顺序 事项。为了避免它 不使用返回值类型转发声明 或 按相同顺序包含标题 . 要获得可能的解释,请查看以下内容: 功能h
功能cpp
食物
注意,整个Foo都放在一个CPU寄存器中。 功能装配(MSVS 2005)
当func()被声明时,Foo的大小未知。它不知道Foo怎么会被退回。所以func()期望指针返回值存储作为其参数。在这里 _ $ReturnUdt$。Foo()的值复制到那里。 如果在func.cpp中更改标题顺序,则会得到: 函数asm
现在编译器知道Foo足够小,所以它是通过寄存器返回的,不需要额外的参数。 主.cpp
注意,这里Foo的大小在func()声明时是已知的。 主.asm
所以编译器假设func()将通过寄存器返回值。它不传递指向临时位置的指针来存储返回值。 但如果func()期望它写入内存的指针损坏堆栈。 让我们更改标题顺序,让func.h优先。 主.asm
编译器传递func()所期望的指针,因此不会导致堆栈损坏。 如果Foo的大小大于2个整数,编译器将始终传递指针。 |
3
1
在海合会的领导下对我来说很好。我不知道为什么,因为
|
Xirema · 如何正确编写运算符的R值重载 7 年前 |
Mário Feroldi · 在运行时调用代码中未调用的函数 7 年前 |
chqrlie · 所有位0都可以是整数的陷阱表示吗? 7 年前 |
Vincent · 打印零,但不基于该条件退出循环 7 年前 |
Dror K. · 用%p打印空指针是未定义的行为? 7 年前 |
Bite Bytes · C中允许这种函数调用吗 7 年前 |
K J Gor · C中strncpy的内存混淆 8 年前 |