为什么要在方法参数列表中添加 void

Why add void to method parameter list

提问人:Luchian Grigore 提问时间:9/14/2011 更新时间:11/12/2021 访问量:11885

问:

我见过具有以下签名的方法:

void foo (void);

他们不争辩,但是我想知道这样做是否有用。你想这样做有什么理由吗?

C++语言

评论

2赞 e-MEE 9/14/2011
重复 stackoverflow.com/questions/51032/...
0赞 Luchian Grigore 9/14/2011
@nabulke几个月前我读了那个解释,当时我正在经历 parashift,我想我忘记了它:)
3赞 nabulke 9/14/2011
有人可能想知道为什么即使在 Visual Studio 2010 中,自动生成的构造函数/析构函数仍然会导致以下代码: 以及CClassname(void)~CClassname(void)
1赞 Jon 9/14/2011
@nabulke:如果它没有坏,就不要修理它。
0赞 Mark A. Ropper 6/24/2015
@nabulke您的链接现在不起作用,我相信这是它的新位置?

答:

3赞 Gilad Naor 9/14/2011 #1

这是旧版本的 C 的遗留问题,适用于没有参数的函数。

17赞 Jon 9/14/2011 #2

C++ 标准说(强调我的):

8.3.5.2

parameter-declaration-clause 确定可以 指定,以及调用函数时的处理。[注: parameter-declaration-clause 用于转换参数 在函数调用中指定;参见 5.2.2。] 如果 parameter-declaration-clause 为空,则函数不取 参数

这意味着,如果你正在与编译器交谈,这只是一个品味问题。

如果您正在编写将被其他人阅读的代码,那么 C++ 的做事方式是

void foo();

另一种形式仅出于与C相容的原因而仍然有效,因为C之间有两个签名之间存在差异。

评论

0赞 Jon 9/14/2011
@DavidHeffernan:“这是一个品味问题”不是含蓄地回答了吗?请注意,我只考虑了“新鲜”的 C++ 代码,而不是过去曾经是 C 但被移植的代码,在这种情况下,“因为没有人费心将其更改为现代方式”可能是一个答案。
1赞 Jon 9/14/2011
@DavidHeffernan:我能看到它的价值,所以我做了一个编辑。感谢您的输入。
54赞 Raymond Chen 9/14/2011 #3

这是旧版本C的延续,其中的意思是“参数数量未知的函数”,意思是“参数为零的函数”。在 C++ 中,两者都表示“零参数的函数”,但有些人更喜欢第二种形式,因为它更明确。foo()foo(void)foo()foo(void)

评论

7赞 Keith Thompson 9/14/2011
这不仅仅是旧版本的 C。从 1989 年 ANSI 标准开始的所有 C 版本中,意味着 foo 没有参数a,并且意味着 foo 具有固定但未指定的参数数量和类型。C++ 接受相同的语法以兼容 C。void foo(void);voi foo();
20赞 James Kanze 9/14/2011
更准确地说:在C语言的“较旧”(读作“非常旧”)版本中,是声明函数的唯一方法,并且没有验证参数的数量或类型。当 C 采用 C++ 的函数原型时,存在向后兼容性问题(因为在 C++ 中,这意味着没有参数,因为它没有说明 C 中的参数)。C标准委员会发明了作为解决方法,C++委员会出于C兼容性的原因采用了它。foo()f()f(void)
0赞 Keith Thompson 9/14/2011
@James:我想你的意思是C标准委员会发明了它。
0赞 James Kanze 9/14/2011
@Keith当然。感谢您指出它;我将编辑我的评论以纠正此问题。(除了我不能。这似乎是我唯一可以编辑的评论。
1赞 Raymond Chen 6/3/2013
@gsingh2011 您必须在定义中声明参数。旧版本的 C 不允许在正向声明中声明参数。有关更多详细信息,请阅读 C 标准。
3赞 David Heffernan 9/14/2011 #4

在 C++ 代码中,没有任何理由以这种方式使用 void。更重要的是,它在很大程度上不是声明无参数函数的惯用方法。

评论

0赞 Justin Time - Reinstate Monica 1/13/2017
我相信,如果一个文件被设计成可以编译为 C 或 C++,它会很有用。...我想不出任何理由,如果这不是本意,我想不出任何理由。