【问题标题】:Relevance of specifying an empty parameter list in C with void [duplicate]在 C 中用 void 指定空参数列表的相关性 [重复]
【发布时间】:2014-06-12 07:55:47
【问题描述】:

在 C++ 和 C# 中完成了我的大部分开发工作后,我发现 C 中使用“void”指定空参数列表的习惯有点奇怪,但在“可信赖的来源”中看到它让我认为它是必需的.问题是为什么

为了澄清,例如在 Visual Studio 中,我不能在启用 C 编译器开关和禁用 C++ 编译器开关的任何组合中,在编写此代码时获得编译器警告:

void foo_bar();

那么,是什么使得有必要用这个来声明它:

void foo_bar(void);

只是旧的 C 标准仍然存在,后来的 C 标准不需要吗?

【问题讨论】:

  • @Emilien, @ RaymondChen 这两者都不是骗人的,因为它没有问同样的问题。它不问“有什么区别”,而是问为什么在使用一个与另一个时没有错误。

标签: c


【解决方案1】:

背景故事:

在 C 中声明函数(实际上是任何符号)时,您需要以正确的顺序声明所有内容(在使用之前声明函数),否则您会收到有关未定义符号的错误。

函数的前向声明允许您通过仅声明函数签名(没有主体)来完成此操作。这允许编译器识别函数名称(符号),然后在它们被完全定义之前使用它们。

当使用前向声明导出库的可公开访问的函数(在您的公共头文件中)时,您将声明整个签名,以便您的库的用户知道需要哪些参数。

当您将前向声明用于您自己的内部使用时,您(有时)不需要声明函数的整个签名,只需返回类型和名称就足够了——不需要参数。只有在最终定义函数时,才会指定参数列表。

直接回答:

是的,它只是 旧的 C 标准,仅此而已。因为同样的C standardese说空括号意味着未知数量的参数(不一定是0)。

相关阅读:

This question 前段时间我曾问过我试图了解(像你一样)用“未知数量的参数”声明函数的实用性——显然是以一种非常误解的方式。

【讨论】:

  • 空括号并不意味着“任意数量的参数”。它的意思是“这个函数接受固定数量的参数,但我不知道有多少。”差异是微妙的,但意义重大。
  • @RaymondChen 是的,你是对的,我会更新的。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多