题
这个问题已经有一个答案在这里:
我目前正在进行重构/整理一些旧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()
是坏的做法C,在我的经验,由于你失去的编译的能力比较功能的声明,其定义,保证它会被称为正确。
例如,以下代码是符合标准的C:
#include <stdio.h>
void foo();
void bar(void) {
foo();
}
void foo(int a) {
printf("%d\n", a);
}
但结果不确定的行为,因为 a
是不过来 foo
.
C++中,有两个版本的 foo
:一个需要没有参数和一个需要一个 int
.所以 bar
风呼唤的未定义的版本,这将导致一个接头的错误(假设没有其他的定义 foo
任何地方).
答复上述是相当正确的,但我可链接到大卫*特里布尔是优秀的网页,因为它提供了一个 很好的解释 在这个和许多其他问题。
亮点:
C区别之间的功能 宣布的与空参数清单 和一个功能的声明 参表组成的唯一 无效。前者是一个unprototyped 功能把数目不详 的参数,而后者是一个 原型功能把没有 参数。
C++,另一方面,使得没有 区分两种 声明,并认为他们两个 意味着一个功能把没有 参数。
代码,目的是要 编译为C或C++、最好的 解决这个问题是总是 声明的功能把没有参数 一个明显无效的原型。
空功能原型的一个 废弃的特征在C99(因为他们 在C89).
编辑:后看的标准,这是也许值得注意的func(void)语法 不 弃用C++,但它通常被认为更多的C式成语。我认为最C++编程,我碰到喜欢的空参数清单。
编辑2:增加一个引用C++标准,第8.3.5条第2款:
"如果该参数-宣言》的条款是空的,功能需要,没有参数。该清单参数(void)相当于空参数清单。除了为这种特殊情况下,无效不是一个参数类型(虽然种类型源自无效的,例如void*,能)。"
有没有说过任何形式已经过时了。再次感谢先生特里布尔的卓越网站的指着我的正确部分的标准。
tl博士:使用 void
.
鉴于后向兼容性C++、和位的模糊性确定了下面,我主张,我们去的所有办法回到列和ANSI C为一个决定性的答案:
int getline(void);
int copy(void)
由于专门版本的正确的单词和复制没有争论, 逻辑表明,他们的原型在一开始的文件 应
getline()
和copy()
.但是,为兼容性 老C程序的标准需要一个空的清单作为一个旧式风格的 《宣言》,并关闭所有参数清单检查;这个词void
必须用于一个明确空白名单。[Kernighan&里奇,C编程语言,1988年,前列腺32-33段]
和..
特别意义的空参数列表的目的是允许的 老C节目编制与新编译器。但这是个坏主意 使用新的程序。如果功能需要的论点,声明 他们;如果它没有参数、使用无效[同上,Pg。73]
编辑:打破了其余成一个单独的讨论:并指定使用无效,在《宣言》的一个函数,不论点解决最棘手的分析?
void f()
被弃用, void f(void)
建议:
6.11.6功能的声明:
1 使用功能的声明与空括号(没有原型参数的格式 类型的声明),是一种过时的特征。
介绍:
2某些功能是过时的,这意味着它们可以考虑 撤回在今后修订的这一国际标准。他们是保留,因为 他们的广泛使用,但它们在新的实现方式(执行 特)或新的方案(为语言[6.11]或图书馆功能[7.31])是气馁。
详细讨论: https://stackoverflow.com/a/36292431/895245
既没有 void f(void)
也不 void f()
是废弃。
void f(void)
存在兼容性C。 附件C"兼容性"C.1.7第8条:声明:
8.3.5变化:C++、功能宣布具有空参数表没有参数。在C,一个空的 参数清单意味着,数量和类型的功能的论点是未知的。
由于 void f()
对使用和C void f(void)
建议, void f(void)
将存在,只要C++想要保持兼容性。
void f(void)
和 void f()
都是相同的,在C++。这样的时间越长 void f(void)
才有意义,如果你关心编写代码,汇编根据C和C++,这很可能是不值得的。
在C++ int f(void)
的确是一个过时的声明是100%,相当于 int f()
.它的 是 同样的签名。的 void
在这方面是作为重要,因为例如空白。这也意味着,他们受到一个定义的规则(他们不过载)和 Derived::f(void)
复盖 Base::f()
.
不要惹这样的东西 f(const void)
, 虽然。没有很多的共识是什么样的怪事装置。