考虑这两个函数定义:

void foo() { }

void foo(void) { }

这两者有什么区别吗?如果不是,为什么是 void 争论有吗?审美原因?

有帮助吗?

解决方案

C:

  • void foo() 意思是“一个函数 foo 接受未指定数量的未指定类型的参数”
  • void foo(void) 意思是“一个函数 foo 不接受任何争论”

C++:

  • void foo() 意思是“一个函数 foo 不接受任何争论”
  • void foo(void) 意思是“一个函数 foo 不接受任何争论”

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

其他提示

我知道你的问题与 C++ 有关,但是当涉及到 C 时,答案可以在 K&R 第 72-73 页中找到:

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

double atof();

这也被认为意味着关于Atof的论点没有什么可以假设的。所有参数检查均已关闭。空参数列表的这种特殊含义旨在允许较旧的C程序与新编译器进行编译。但是,将其与新程序一起使用是一个坏主意。如果函数接受参数,则声明它们;如果不需要争论,请使用void。

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.参数 - 解析范围将确定可以指定的参数及其处理,当调用函数时。...]如果参数 - 解析范围为空,则该函数不带参数。参数列表(void)相当于空参数列表。

C99

正如 C++11 中提到的, int f() 没有指定任何有关参数的内容,并且已过时。

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

我已经详细解读了C99标准: https://stackoverflow.com/a/36292431/895245

在 C 中,您在空函数引用中使用 void ,以便编译器具有原型,并且该原型“无参数”。在 C++ 中,您不必告诉编译器您有原型,因为您不能忽略原型。

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