我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:
int f(void)
我倾向于写作:
int f()
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
派生类包括成员函数:
int f()
这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?
在C中,声明int f(void)
表示返回int的函数,该函数不带参数.声明int f()
表示返回int的函数,它接受任意数量的参数.因此,如果你有一个在C中没有参数的函数,那么前者是正确的原型.
在C++中,我认为int f(void)
已弃用,并且int f()
是首选,因为它特别指的是不带参数的函数.
int f()
根据我的经验,添加到Chris的答案中,在C中使用是不好的做法,因为你失去了编译器将函数声明与其定义进行比较的能力,以确保它将被正确调用.
例如,以下代码符合标准C:
#includevoid foo(); void bar(void) { foo(); } void foo(int a) { printf("%d\n", a); }
但它导致未定义的行为,因为a
没有传递给foo
.
在C++中,有两个版本foo
:一个不带参数,另一个带一个int
.因此bar
最终调用未定义的版本,这将导致链接器错误(假设没有任何其他定义foo
).
上面的答案是完全正确的,但我链接到David Tribble的优秀页面,因为它对这个和许多其他问题给出了很好的解释.
亮点:
C区分用空参数列表声明的函数和用仅包含void的参数列表声明的函数.前者是一个非原型函数,它带有一个未指定数量的参数,而后者是一个没有参数的原型函数.
另一方面,C++没有对两个声明进行区分,并认为它们都是指不带参数的函数.
对于要编译为C或C++的代码,此问题的最佳解决方案是始终使用显式void原型声明不带参数的函数.
空函数原型是C99中不推荐使用的功能(就像它们在C89中一样).
编辑:在查看标准之后,或许值得注意的是,在C++中不推荐使用func(void)语法,但它通常被认为更多是C风格的习语.我认为我遇到的大多数C++程序员更喜欢空参数列表.
编辑2:添加C++标准的引用,第8.3.5节,第2段:
"如果parameter-declaration-clause为空,则该函数不带参数.参数列表(void)等效于空参数列表.除了这种特殊情况,void不应该是参数类型(尽管从void派生的类型) ,例如void*,can)."
没有提到任何一种形式都被弃用了.再次感谢Tribble先生的优秀网站,指出我正确的标准部分.