【问题标题】:Which is preferred: foo(void) or foo() in C++哪个是首选:C++ 中的 foo(void) 或 foo()
【发布时间】:2009-06-20 10:02:01
【问题描述】:

我见过在 C++ 中定义转换运算符重载的两种风格,

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

问题1.我觉得这两种风格(加void与否)功能是一样的,对吧?
问题 2. 有更好的偏好吗?

【问题讨论】:

  • 这确实是之前提出的问题的重复:stackoverflow.com/questions/693788/c-void-arguments 这有帮助吗?
  • 您的标题非常具有误导性/无关紧要。类似“哪个是首选:foo(void) 还是 foo()?”
  • 我同意。我已经编辑了标题。

标签: c++ void


【解决方案1】:

这不仅适用于转换运算符,还适用于 C++ 中所有不带参数的函数。就个人而言,我更喜欢省略 void 以保持一致性。

这种做法起源于 C。最初,当 C 没有原型时,在函数声明中使用了一对空大括号,并且没有提供有关函数预期参数的任何信息。

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

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

【讨论】:

  • “当 C 没有原型时”——你的意思是在过去,C 不允许声明函数原型?好奇的。你能告诉我在这种情况下 C 看起来有多老吗? :-)
  • “为函数声明保留了空括号,以表示‘未指定的参数’,以实现灵活性和向后兼容性。” --对此感到困惑,我认为空括号应该意味着没有参数,而不是“未指定的参数”?有没有cmets?
  • “应该”是什么意思?这是它们在 C++ 中的含义,但不是它们在 C 中的含义。如果 C 一直都有原型,是的,也许 () 也可以用来表示“无参数”。
  • HP 手册中有一些新旧样式示例:g4u0420c.houston.hp.com/en/B3901-90016/ch03s15.html
  • 谢谢查尔斯,1. 让我确认一下,我想你的意思是在 C++ 中它们总是一样的正确吗? 2. 为什么在 C 中它们可能不同?你能推荐我一些文件来阅读或展示一些示例来说明吗?
【解决方案2】:

引用 ISO C++ 常见问题解答,Should I use f(void) or f()?

C 程序员在声明不带参数的函数时经常使用f(void),但在 C++ 中这被认为是不好的风格。事实上,f(void) 风格被 C++ 的创造者 Bjarne Stroustrup、C 的共同创造者 Dennis Ritchie 和 Unix 诞生的研究部门负责人 Doug McIlroy 称为“可憎”。

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

向权威 FTW 上诉 :)

【讨论】:

  • 可惜我在你发布之前就开始回答了:X。 +1
【解决方案3】:

在 C++ 中 foo() 和 foo(void) 是相同的——“没有参数”。在 C99 标准中,前者的意思是“未定义的参数个数”,而后者的意思是“没有参数”。

但是,如果你依赖 C 中的 foo() 行为,你应该被枪毙。

所以这意味着你可以使用任何一个。现在就个人而言,我更喜欢 foo() 而不是 foo(void),因为我讨厌视觉上的混乱,但这只是偏好。我是 Python 人 :)

【讨论】:

  • 谢谢,我也喜欢保存类型!
  • 再问一个问题,在 C++ 中它们是相同的,但在 C 中,答案是什么?
  • 在 C 中,声明 foo() 表示“未定义的参数”,包括数量和类型。
  • 我可以想象在函数指针中使用 C 中未定义的参数很有用,例如,它只能接受一个参数,但类型未知:void (*func)() = /* func that takes an int */; func(11); func = /* func that takes a char * */; func("hello"); 但这是可疑的值。
【解决方案4】:

我相信“旧”C(不知道是什么版本)foo() 表示“任何参数”,而foo(void) 表示没有参数。 foo() 'any parameters' 版本已被弃用,我相信 c99。

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

C++ 将接受foo(void),但它的含义与foo() 相同,即“无参数”。

所以在 C++ 中,首选的方式是使用foo()

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2020-03-08
      • 2012-04-04
      • 2013-11-06
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多