在C++中,是哪个更好:foo(void)还是foo()?

4

我见过两种在C++中定义转换运算符重载的样式:

  1. operator int* (void) const
  2. operator int*() const

问题1. 我认为这两种方式(是否添加 void)具有相同的功能,是吗?
问题2. 你有任何偏好哪种更好吗?


这实际上是之前提出的问题的重复:https://dev59.com/8HRB5IYBdhLWcg3wLkxM 这有帮助吗? - Daniel Earwicker
你的标题有些误导性/不相关。可以改成类似“哪个更好:foo(void)还是foo()?” - Dan
我同意。我已编辑标题。 - George2
5个回答

10

这不仅适用于转换运算符,而是适用于C++中所有没有参数的函数。出于一致性考虑,个人更喜欢省略void

这种做法起源于C语言。在C语言没有原型时,空括号对在函数声明中被用来表示未指定参数,并没有提供有关函数所期望的参数的信息。

当原型被添加时,空括号被保留在函数声明中以表示“未指定参数”,以实现灵活性和向后兼容性。为了提供一个显式的原型表示“不带参数”,加入了语法(void)

在C++中,所有函数声明都必须有原型,因此()(void)具有相同的含义。


“当C语言没有原型时” - 您的意思是在旧时代,C语言不允许声明函数原型吗?很好奇。您能否展示一下这种情况下旧版的C语言是什么样子的呢? :-) - George2
保留空括号用于函数声明,表示“未指定参数”,以提高灵活性和向后兼容性。对此感到困惑,我认为空括号应该表示没有参数,而不是“未指定参数”?有任何意见吗? - George2
1
你说的“应该是什么意思”是什么意思?在C++中,它们确实是这个意思,但在C中不是。如果C一直有原型,那么()也许可以用来表示“没有参数”。 - CB Bailey
1
这本惠普手册中有一些旧式和新式的例子:http://g4u0420c.houston.hp.com/en/B3901-90016/ch03s15.html - CB Bailey
谢谢Charles,1.让我确认一下,你的意思是在C++中它们总是相同的,对吗?2.为什么在C中它们可能不同?你能推荐一些阅读材料或展示一些样例来说明吗? - George2

9

引用自ISO C++ FAQ,我应该使用f(void)还是f()

C程序员在声明不带参数的函数时通常使用f(void),然而在C ++中,这被认为是一种不良风格。事实上,f(void)样式被C++的创建者Bjarne Stroustrup、C的共同创造者Dennis Ritchie以及Unix诞生的研究部门负责人Doug McIlroy称为“丑陋的东西”。

如果您正在编写C++代码,则应使用f()。在C++中,f(void)样式是合法的,但只是为了更容易地编译C代码。

权威性的呼声高 :)


很遗憾,在你发布之前我已经开始回答了:X。+1 - user34537

4
在C++中,foo()和foo(void)是相同的——表示“没有参数”。在C99标准中,前者表示“未定义数量的参数”,而后者表示“没有参数”。
然而,如果你在C中依赖foo()的行为,你应该被开除。
这意味着你可以使用任何一种方式。个人而言,我更喜欢foo()而不是foo(void),因为我讨厌视觉上的杂乱,但这只是个人偏好。我是一个Python爱好者 :)

谢谢,我也更喜欢保存类型! - George2
进一步的问题,在C++中它们是相同的,但在C中,答案是什么? - George2
在C语言中,foo()的声明意味着“未定义参数”,无论是数量还是类型。 - oggy
我可以想象在C语言中使用未定义参数的一种有用方法,即在函数指针中可以接受一个未知类型的参数,例如:void (*func)() = /* 接受int类型参数的函数 */; func(11); func = /* 接受char *类型参数的函数 */; func("hello"); 但这种方法的价值是可疑的。 - Chris Lutz

0

我相信在“旧版”C语言中(不知道是哪个版本),foo()表示“任意参数”,而foo(void)表示没有参数。我相信在c99中,foo()的“任意参数”版本已经被弃用。

快速搜索发现this wikipedia文章提到了类似的事实。

C++将接受foo(void),但它的意思与foo()相同,即表示“没有参数”。

因此,在C++中,首选的方法是使用foo()


-1

省略void。在旧式C中,所有函数都被假定为int name(...)。指定void意味着它不是可变长度参数。该默认值已被删除,所有函数都必须指定(谢天谢地。当任何东西都可以是任何东西时,这是野蛮的西部)。在C++中,您永远不需要编写(void)。省略它。就像C++库一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接