在没有参数的函数中使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

在没有参数的 void 函数中更改变量

plpgsql 错误:RETURN 在返回 void 的函数中不能有参数

C语言学习笔记--void关键字

C进阶8goto和void分析

请问这个C语言中有参数的函数是怎么传递值的,调用的时候没有参数啊。

我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)