Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在现代C和C+中f(void)是否被弃用+; 我现在正在重构/整理C++程序中使用的一些旧C代码,并经常看到函数如: int f(void)_C++_C_Refactoring_Void - Fatal编程技术网

在现代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和ValueF(Value)中被弃用,空F(空隙)< /C> >只要C++希望保持兼容性,就存在。< /P> 空> f(空)<代码>和<代码>无效f>(<)>代码>在C++中是相同的。因此,如果您关心编写C++和C++环境下编译的代码,那么<<代码>空隙f(空隙)< /COD>仅是有意义的,这可能不值得。
详细讨论:

tl;dr:使用
void

给出C++中的向后兼容性,以及下面定义的歧义位,我断言我们回到KnR和ANSI C,得到一个结论性的答案:

int getline(void);
int copy(void)
因为getline和copy的专用版本没有