在现代C和C+中f(void)是否被弃用+; 我现在正在重构/整理C++程序中使用的一些旧C代码,并经常看到函数如: int f(void)
我倾向于这样写:在现代C和C+中f(void)是否被弃用+; 我现在正在重构/整理C++程序中使用的一些旧C代码,并经常看到函数如: int f(void),c++,c,refactoring,void,C++,C,Refactoring,Void,我倾向于这样写: int f() 是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为: virtual int f(void) 派生类包括一个成员函数: int f() 这是有效的覆盖吗?此外,基于几乎相同的签名,我可能会遇到任何链接器问题吗?在C中,声明intf(void)表示返回不带参数的int的函数。声明int f()表示返回int的函数,该函数接受任意数量的参数。因此,如果您有一个
int f()
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
派生类包括一个成员函数:
int f()
这是有效的覆盖吗?此外,基于几乎相同的签名,我可能会遇到任何链接器问题吗?在C中,声明
intf(void)
表示返回不带参数的int的函数。声明int f()
表示返回int的函数,该函数接受任意数量的参数。因此,如果您有一个在C中不带参数的函数,那么前者就是正确的原型
< C++ >中,我相信<>代码> INTF(空)是不推荐的,<代码> int f>(<)>代码>是首选的,因为它具体指的是一个不带参数的函数。< /P> < p>添加到克里斯的答案中,使用<代码> int f>(<)>代码>是我的经验,在C中是坏的。由于编译器无法将函数声明与其定义进行比较,因此无法确保正确调用函数 例如,以下代码符合标准C:
#include <stdio.h>
void foo();
void bar(void) {
foo();
}
void foo(int a) {
printf("%d\n", a);
}
#包括
void foo();
空心条(空心){
foo();
}
无效foo(int a){
printf(“%d\n”,a);
}
但是它会导致未定义的行为,因为a
没有传递给foo
<>在C++中,有两个版本:代码> Foo:一个不带参数,一个采用<代码> int <代码>。因此,<代码> bar <代码>调用未定义的版本,这将导致链接错误(假设没有任何其他的定义<代码> Foo< /COD>任何地方)。C++中的 < P> >代码> INTF(无效)确实是一个弃用声明,相当于代码“int f*())< /代码> 100%。是同一个签名。在此上下文中,void
与空白一样重要。这也意味着它们受一个定义规则的约束(它们不会重载)和Derived::f(void)
覆盖Base::f()
不过,不要乱搞
f(const void)
之类的东西。对于这种奇怪意味着什么,人们并没有太多的共识。上面的答案是非常正确的,但我将链接到David Tribble的优秀页面,因为它提供了关于这一问题和许多其他问题的答案
亮点:
C区分一个函数
使用空参数列表声明
和一个用
参数列表只包含
无效的前者是一种未分类的类型
采用未指定数字的函数
而后者是一个
原型函数不接受
争论
另一方面,C++则没有什么好处
两者的区别
声明并同时考虑它们
意思是一个函数不接受
争论
对于打算
编译为C或C++,最好
解决这个问题的办法是永远
声明不带参数的函数
具有显式的void原型
空函数原型是一个
C99中不推荐的功能(因为它们
在C89)
编辑:在查看标准之后,也许值得注意的是,FUNC(Valuy)语法在C++中并不被贬低,但通常被认为是C风格的成语。我认为我所运行的大多数C++程序员都喜欢空的参数列表。 < >编辑2:从C++标准中添加一个引用,第8 3.5节,第2段:
如果参数声明子句为空,则函数不接受任何参数。参数列表(void)等同于空参数列表。除此特殊情况外,void不应是参数类型(尽管从void派生的类型,如void*,可以是) 没有提到这两种形式都不推荐使用。再次感谢Tribble先生的优秀网站为我指出了标准的正确部分。void f()
不推荐使用,void f(void)
建议:
6.11.6功能声明器:
一,
使用带空括号的函数声明符(不是原型格式参数
类型声明器)是一种过时的功能
导言:
2某些功能已过时,这意味着它们可能会被考虑用于
在本国际标准的未来修订中撤销。保留它们是因为
它们的广泛使用,但它们在新的实现中的使用(用于实现
功能)或新程序(用于语言[6.11]或库功能[7.31])不受鼓励
详细讨论:
void f(void)
和void f()
都不推荐使用
void f(void)
与C兼容。附录C“兼容性”C.1.7第8条:声明人:
8.3.5更改:在C++中,使用空参数列表声明的函数不接受任何参数。在C中,一个空的
参数列表表示函数参数的数量和类型未知
<> >由于代码>虚空For(<代码>)在C和详细讨论:tl;dr:使用
void
给出C++中的向后兼容性,以及下面定义的歧义位,我断言我们回到KnR和ANSI C,得到一个结论性的答案:
int getline(void);
int copy(void)
因为getline和copy的专用版本没有