考虑这两个函数定义:
void foo() { } void foo(void) { }
这两者有什么区别吗?如果没有,为什么 void 参数存在?美学原因?
void
在 C :
void foo() 表示“函数 foo 采用未指定数量的未指定类型的参数”
void foo()
foo
void foo(void) 表示“函数 foo 不带参数”
void foo(void)
在 C++ :
void foo() 表示“函数 foo 不参数”
因此,通过编写 foo(void) ,我们在两种语言中实现相同的解释并使我们的 Headers 多语言(尽管我们通常需要对 Headers 做更多的事情以使它们成为真正的跨语言;即,如果我们',请将它们包装在_1080535中 . 重新编译C) .
foo(void)
我意识到你的问题与C有关,但是当谈到C时,答案可以在K&R,第72-73页找到:
此外,如果函数声明不包含参数,例如double atof();这也意味着没有任何关于atof论点的假设;所有参数检查都已关闭 . 空参数列表的这种特殊含义旨在允许较旧的C程序使用新的编译器进行编译 . 但是将它与新程序一起使用是个坏主意 . 如果函数接受参数,则声明它们;如果它不带参数,请使用void .
C++11 N3337 standard draft
没有区别 .
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
附件C "Compatibility" C.1.7第8条:申报人说:
8.3.5更改:在C中,使用空参数列表声明的函数不带参数 . 在C中,空参数列表表示函数参数的数量和类型是未知的 . 示例:int f();//表示C中的int f(void)// C中的int f(未知)基本原理:这是为了避免错误的函数调用(即,使用错误的数字或类型的参数调用函数) . 对原始特征的影响:改变定义明确的特征的语义 . 此功能在C中标记为“过时” .
8.5.3功能说:
parameter-declaration-clause确定调用函数时可以指定的参数及其处理 . [...]如果parameter-declaration-clause为空,则该函数不带参数 . 参数列表(void)等效于空参数列表 .
C99
如C 11所述, int f() 对参数没有任何规定,而且已经过时了 .
int f()
它可以导致工作代码或UB .
我已经详细解释了C99标准:https://stackoverflow.com/a/36292431/895245
在C中,在空函数引用中使用void,以便编译器具有原型,并且该原型具有“无参数” . 在C中,您不必告诉编译器您有原型,因为您不能省略原型 .
4 回答
在 C :
void foo()
表示“函数foo
采用未指定数量的未指定类型的参数”void foo(void)
表示“函数foo
不带参数”在 C++ :
void foo()
表示“函数foo
不参数”void foo(void)
表示“函数foo
不带参数”因此,通过编写
foo(void)
,我们在两种语言中实现相同的解释并使我们的 Headers 多语言(尽管我们通常需要对 Headers 做更多的事情以使它们成为真正的跨语言;即,如果我们',请将它们包装在_1080535中 . 重新编译C) .我意识到你的问题与C有关,但是当谈到C时,答案可以在K&R,第72-73页找到:
C++11 N3337 standard draft
没有区别 .
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
附件C "Compatibility" C.1.7第8条:申报人说:
8.5.3功能说:
C99
如C 11所述,
int f()
对参数没有任何规定,而且已经过时了 .它可以导致工作代码或UB .
我已经详细解释了C99标准:https://stackoverflow.com/a/36292431/895245
在C中,在空函数引用中使用void,以便编译器具有原型,并且该原型具有“无参数” . 在C中,您不必告诉编译器您有原型,因为您不能省略原型 .