为啥我的 C++ 函数只有放在 main() 之后才起作用?

Posted

技术标签:

【中文标题】为啥我的 C++ 函数只有放在 main() 之后才起作用?【英文标题】:Why does my C++ function, only when it's placed after main(), not work?为什么我的 C++ 函数只有放在 main() 之后才起作用? 【发布时间】:2021-03-29 20:38:01 【问题描述】:

我最近学习了 C++,并决定尝试制作一个函数。但是,我的函数 func() 遇到了问题,即使事先声明,它也只有放在 main() 函数之前才有效。

如果我把它放在main() 函数之后,系统会告诉我“没有匹配的函数可以调用func”。

注意:另一方面,func2 函数即使放在 main() 函数之前或之后也有效。

代码如下:

#include <stdio.h>
#include <iostream>

void func2();

int func();

int main()

  int y=2;

  std :: cout << "Hello World\n" << func(y) << "\n";
  func2();
  return 0;


int func(int x)

 x *= 2;
 return x;


void func2()

 std :: cout << "Hello there";

【问题讨论】:

作为一般规则,您应该始终在使用函数之前声明它们。您还应该按照它们的定义完全声明它们。 在 C 中,func()func(void) 曾经是不同的东西,在 C++ 中是相同的东西。 【参考方案1】:

在 C 语言中,声明 int func(); 表示 具有未指定数量的任意类型参数的函数,返回一个 int

在 C++ 语言中,相同的声明 int func(); 表示一个函数没有任何参数,返回一个 int

因此,在 C++ 中,带有int 类型参数的func 的定义是一个重载。对于编译器来说,它是一个不同的函数,在原代码中没有在使用前声明,所以会报错。

但在 C 中,这将是完全合法的。

【讨论】:

次要细节:定义具有不同参数集的函数不是矛盾,而是重载 @IgorG 你是对的。我将编辑我的答案以更正。 @GiorgosTsolakidis 即使在 C 中该功能也被标记为过时。现代平台上的一些调用约定实际上无法支持它,甚至我认为 Windows 上的新版本“快速”调用也是如此。【参考方案2】:
int func();

int func(int x)

看到区别了吗?第一个应该是

int func(int x);

您告诉编译器 func 是一个没有参数的函数,然后当您尝试使用一个参数调用它时,编译器说“没有匹配的函数”。

【讨论】:

这里的关键是,在 C++ 中,您可以拥有两个名称相同但参数不同的函数,这与 C 不同的是,您不能这样做,而且定义会相互冲突。 @tadman 至少旧版本的 C 允许在没有参数的情况下声明,只需要名称和“未知数量的参数”,然后正确的参数是调用者的责任。要声明没有任何参数的函数,必须说int func(void) @Swift-FridayPie 我不想记住 K&R C。

以上是关于为啥我的 C++ 函数只有放在 main() 之后才起作用?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 枚举类型声明可以放在 int main 的前面吗?

请教各位大侠C++中程序在开始main()函数之前的执行顺序是怎么样的?

C++语言怎么在main函数执行之前执行一段代码

为啥 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中

Dev C++为啥不支持以void main()为主函数的空函数C程序?老师给出的一直都是以Tu

为啥 C++ 中的 main() 没有重载以使用 std::string?