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

C++或C中foo(void)和foo()之间有区别吗?

如何解决《C++或C中foo(void)和foo()之间有区别吗?》经验,为你挑选了3个好方法。

考虑这两个函数定义:

void foo() { }

void foo(void) { }

这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?



1> DrPizza..:

C:

void foo()表示"一个函数foo采用未指定数量的未指定类型的参数"

void foo(void)意思是"一个foo不带参数的函数"

C++中:

void foo()意思是"一个foo不带参数的函数"

void foo(void)意思是"一个foo不带参数的函数"

foo(void)因此,通过编写,我们在两种语言中实现了相同的解释,并使我们的标题多语言化(尽管我们通常需要对标题做更多的事情,使它们真正成为跨语言;即,extern "C"如果我们正在编译,请将它们包装在一起C++).


在最近的一个问题上,@ James Kanze发布了一个有趣的消息.重新发布此处以避免丢失它:C的第一个版本不允许指定函数可能采用的参数数量,因此`void foo()`是声明函数的唯一语法.当引入签名时,C委员会必须消除旧语法中的无参数的歧义,并引入了`void foo(void)`语法.为了兼容性,C++接受了它.
但是如果C++需要`void`,那么它本可以避免"最令人烦恼的解析"问题.
没错,但是在C++中还有很多其他糟糕的解析,对于其中任何一个都没有真正的意义.
@chacham15`void foo(){if(rand())foo(5); 编译和运行(导致未定义的行为除非你非常幸运),而具有相同主体的`void foo(void)`会导致编译错误.
你能给我一个C C90及其后的例子吗?使用`void foo()`而不是`void foo(void)`会产生功能上的区别吗?即我多年来一直在使用没有虚空的版本,并没有看到任何问题,我错过了什么?

2> Kyle Cronin..:

我意识到你的问题与C++有关,但是当谈到C时,答案可以在K&R,第72-73页找到:

此外,如果函数声明不包含参数,如

double atof();

这也意味着没有任何关于atof论点的假设; 所有参数检查都已关闭.空参数列表的这种特殊含义旨在允许较旧的C程序使用新的编译器进行编译.但是将它与新程序一起使用是个坏主意.如果函数接受参数,则声明它们; 如果它不带参数,请使用void.



3> Ciro Santill..:

C++ 11 N3337标准草案

没有区别.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

附件C"兼容性"C.1.7第8条:申报人说:

8.3.5更改:在C++中,使用空参数列表声明的函数不带参数.在C中,空参数列表表示函数参数的数量和类型是未知的.

例:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

基本原理:这是为了避免错误的函数调用(即,使用错误的数字或类型的参数调用函数).

对原始特征的影响:改变定义明确的特征的语义.此功能在C中标记为"过时".

8.5.3功能说:

4.参数声明子句确定调用函数时可以指定的参数及其处理.[...]如果parameter-declaration-clause为空,则该函数不带参数.参数列表(void)等效于空参数列表.

C99

正如C++ 11所提到的,int f()没有对参数进行任何指定,而且过时了.

它可以导致工作代码或UB.

我在以下网址详细解释了C99标准:https://stackoverflow.com/a/36292431/895245

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