C++函数的声明和定义不同但效果很好
Posted
技术标签:
【中文标题】C++函数的声明和定义不同但效果很好【英文标题】:C++ function`s declaration and definition are different but it works well 【发布时间】:2019-12-13 07:25:37 【问题描述】:我正在编写一些 C++ 代码 我发现了一件很奇怪的事情 就像下面的代码一样,即使函数的声明和定义不同,它也能很好地工作
有谁知道这怎么可能?
构建命令:g++ main.cpp foo.cpp
// main.cpp
#include <iostream>
char foo();
int main()
foo();
// foo.cpp
#include <iostream>
void foo()
std::cout << "I'm foo" << std::endl;
【问题讨论】:
不幸的是,“工作顺利”是undefined behavior 的可能结果之一。 这工作可能是因为 x86 调用约定在寄存器中传递整数返回值(即rax
)。
谢谢你们,我会检查你提到的内容
为什么c???....
因为您不接受 main() 中的返回类型,所以它可以工作。它也基于编译规则。但是当我编译时出现以下错误: 1>Temp.obj : error LNK2019: unresolved external symbol "char __cdecl foo(void)" (?foo@@YADXZ) referenced in function _main 1> 提示已定义且可能潜在的符号匹配:1>“void __cdecl foo(void)”(?foo@@YAXXZ)
【参考方案1】:
编译成功,因为您没有考虑 main() 中的返回类型,它可以工作。 此外,您还没有使用函数的返回类型。它忽略了那里的返回类型。 它也是基于编译规则的。
链接器可能不允许并引发错误。 我正在使用 VS2019,但出现以下链接错误(错误 LNK2019:未解析的外部符号)。
【讨论】:
以上是关于C++函数的声明和定义不同但效果很好的主要内容,如果未能解决你的问题,请参考以下文章
C++ 内联函数:这样声明,这样定义,还是两者兼而有之?为啥?
C++ 变量名(可以将 main 声明为变量,但对于其他函数名则不然)