我目前正在进行重构/整理一些旧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]

编辑:打破了其余成一个单独的讨论:并指定使用无效,在《宣言》的一个函数,不论点解决最棘手的分析?

C11N1570标准草案

void f() 被弃用, void f(void) 建议:

6.11.6功能的声明:

1 使用功能的声明与空括号(没有原型参数的格式 类型的声明),是一种过时的特征。

介绍:

2某些功能是过时的,这意味着它们可以考虑 撤回在今后修订的这一国际标准。他们是保留,因为 他们的广泛使用,但它们在新的实现方式(执行 特)或新的方案(为语言[6.11]或图书馆功能[7.31])是气馁。

详细讨论: https://stackoverflow.com/a/36292431/895245

C++11N3337标准草案

既没有 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++,这很可能是不值得的。

详细讨论: https://stackoverflow.com/a/36835303/895245

在C++ int f(void) 的确是一个过时的声明是100%,相当于 int f().它的 同样的签名。的 void 在这方面是作为重要,因为例如空白。这也意味着,他们受到一个定义的规则(他们不过载)和 Derived::f(void) 复盖 Base::f().

不要惹这样的东西 f(const void), 虽然。没有很多的共识是什么样的怪事装置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top