当前位置:  开发笔记 > 编程语言 > 正文

在现代C和C++中不推荐使用f(void)

如何解决《在现代C和C++中不推荐使用f(void)》经验,为你挑选了3个好方法。

我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:

int f(void)

我倾向于写作:

int f()

是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:

virtual int f(void)

派生类包括成员函数:

int f()

这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?



1> Chris Young..:

在C中,声明int f(void)表示返回int的函数,该函数不带参数.声明int f()表示返回int的函数,它接受任意数量的参数.因此,如果你有一个在C中没有参数的函数,那么前者是正确的原型.

在C++中,我认为int f(void)已弃用,并且int f()是首选,因为它特别指的是不带参数的函数.


我不知道void f()意味着C中的任意数量的参数,感谢指出这一点.
我不会用"接受任意数量的参数"来表达它,因为它意味着"采用未知数量的未知类型的参数".给它错误的数字会导致未定义的行为."......"表示它需要任意数量的附加参数
你是对的,乔,在C++中它没有被弃用的语法.我之前检查了标准.但有趣的是,自1989年以来,空参数列表在C语言中已被弃用!

2> Zach Hirsch..:

int f()根据我的经验,添加到Chris的答案中,在C中使用是不好的做法,因为你失去了编译器将函数声明与其定义进行比较的能力,以确保它将被正确调用.

例如,以下代码符合标准C:

#include 
void foo();
void bar(void) {
    foo();
}
void foo(int a) {
    printf("%d\n", a);
}

但它导致未定义的行为,因为a没有传递给foo.

在C++中,有两个版本foo:一个不带参数,另一个带一个int.因此bar最终调用未定义的版本,这将导致链接器错误(假设没有任何其他定义foo).



3> Dan Olson..:

上面的答案是完全正确的,但我链接到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先生的优秀网站,指出我正确的标准部分.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有