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 声明为变量,但对于其他函数名则不然)

C++笔记--函数

C++ Visual Studio Windows:如何在 dll 中声明但不定义外部函数

C++中,怎么将函数模板的声明和定义分开写?

C++入门教程之四:函数