在没有参数的函数中使用 void?
Posted
技术标签:
【中文标题】在没有参数的函数中使用 void?【英文标题】:Using void in functions without parameter? 【发布时间】:2012-03-21 15:49:29 【问题描述】:在 C++ 中使用void
在不带参数的函数中,例如:
class WinMessage
public:
BOOL Translate(void);
;
是多余的,你还不如写Translate();
。
我自己通常包含它,因为当支持代码完成的 IDE 显示 void
时它会有点帮助,因为它确保我的函数绝对不需要参数。
我的问题是,将void
添加到无参数函数是一种好习惯吗?在现代代码中应该鼓励它吗?
【问题讨论】:
@awoodland:“我从 C 那里得到了宿醉。”嗯。看起来很合适。:)
这里是可能有帮助的链接***.com/questions/7412274/…
【参考方案1】:
在 C++ 中
void f(void);
等同于:
void f();
第一种样式仍然可以合法编写这一事实可以归因于 C。 n3290 § C.1.7(C++ 和 ISO C 兼容性)声明:
更改:在 C++ 中,使用空参数列表声明的函数需要 没有参数。
在 C 中,一个空的参数列表意味着数量和 函数参数的类型未知。
例子:
int f(); // means int f(void) in C++ // int f( unknown ) in C
在 C 中,避免那种不受欢迎的“未知”含义是有意义的。在 C++ 中,这是多余的。
简短回答:在 C++ 中,这是过多 C 编程的后遗症。在我看来,这将它放在 C++ 的“除非你真的必须这样做”的括号中。
【讨论】:
C++ 中是否有与 C 的int f()
等价的东西?我应该在这个用例中使用external "C"
吗?
@Spidey 你为什么要这样做?如果你弄错了,这是未定义的行为,并且是早期 C 时代的遗留问题,以降低编译器/链接器的复杂性。在 C++11 中,可变参数模板是一种安全、现代的功能,但不是直接等效的。
我将它用作函数指针数组的类型。我们在客户端和dll代码之间交换了数组指针,从而避免了不断调用dll函数的开销。
@Spidey 如果您想要特定于平台,那么我只需将其设为 FARPROC
数组并进行调用。
如果 FARPROC 是由标准定义的,我在快速和基本的搜索后找不到。我在嵌入式设备中使用 C89,我认为我不能依赖 FARPROC 的定义。顺便问一下,FARPROC 的定义是什么?我敢打赌是int f()
或void *f()
。【参考方案2】:
我完全没有理由这样做。 IDE 将仅使用空参数列表完成函数调用,并且少 4 个字符。
我个人认为这让已经很冗长的 C++ 变得更加冗长。我所知道的语言版本没有需要在这里使用void
。
【讨论】:
如果您认为 C++ 冗长,请尝试 Java。:)
【参考方案3】:
我认为它只会有助于向后兼容旧的 C 代码,否则它是多余的。
【讨论】:
【参考方案4】:我感觉像不。原因:
更多的代码都有BOOL Translate()
表单,因此阅读您的代码的其他人会更自如地使用它并提高工作效率。
屏幕上的内容更少(尤其是像这样的多余内容)意味着阅读您的代码的人会更少思考。
有时,在 1988 年没有使用 C 编程的人会问“foo(void)
是什么意思?”
【讨论】:
【参考方案5】:作为旁注。不包括 void 的另一个原因是可以读取代码和生成类图的软件(如 starUML)将 void 作为参数读取。尽管这可能是 UML 生成软件中的一个缺陷,但如果您想要干净的图表,必须返回并删除“空白”仍然很烦人
【讨论】:
以上是关于在没有参数的函数中使用 void?的主要内容,如果未能解决你的问题,请参考以下文章
plpgsql 错误:RETURN 在返回 void 的函数中不能有参数