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

问题描述 投票:0回答:5

考虑这两个函数定义:

void foo() { }

void foo(void) { }

这两者有什么区别吗?如果不是,为什么会有

void
争论?审美原因?

c++ c arguments function-declaration
5个回答
358
投票

C中:

  • void foo()
    表示“一个函数
    foo
    接受未指定数量的未指定类型的参数”
  • void foo(void)
    表示“不带参数的函数
    foo

C++ 中:

  • void foo()
    表示“不带参数的函数
    foo
  • void foo(void)
    表示“不带参数的函数
    foo

因此,通过编写

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


42
投票

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

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

double atof();

这也意味着无需对 atof 的论据;所有参数检查均已关闭。这个特别的 空参数列表的含义是为了允许旧的 C 使用新编译器编译的程序。但使用它是个坏主意 与新节目。如果函数接受参数,则声明它们;如果 它不需要参数,使用 void。


10
投票

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


3
投票

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


0
投票

从 C23 开始,C 已采用 C++ 的语义来声明具有空参数列表的函数。

在 C++ 和 C23 中:

  • void foo()
    表示“不带参数的函数
    foo
    ”。
  • void foo(void)
    表示“不带参数的函数
    foo
    ”。

非原型函数声明已从 C 语言中删除。

此更改是由提案 N2841:没有原型的函数声明符 引入的,其摘要为:

这消除了对没有原型的函数声明符的过时支持。 没有原型的函数声明符的旧语法被赋予了 C++ 语义

引用当前C23标准草案(N3096,附件M.2第五版):

第五版的主要变化 (

__STDC_VERSION__
202311L
) 包括
...

  • 参数列表为空的强制函数声明 与 仅包含单个
    void;
  • 的参数列表

在 C 和 C++ 中,

void foo()
void foo(void)
现在完全等效。

© www.soinside.com 2019 - 2024. All rights reserved.