为不带参数的函数C with Classes引入了符号,而不是用于表示具有任意数量的参数而不进行类型检查的函数的符号。然而,用户很快就让我相信这种表示法并不优雅,并且使用可以接受参数的函数进行声明远非直观。因此,经过一些实验,决定为不带任何参数的函数保留符号,因为这是没有经验的用户所期望的。为了敢于打破传统,我需要道格·麦克罗伊和丹尼斯·里奇的支持。只有在他们用“恶心”这个词来描述这个符号之后,我才决定给f(void)f()f()Cf(void)f()f()Cf(void)f()明显的语义。然而时至今日,in的型控规则C比in弱得多C++,标准委员会批准了最先出现ANSI C的“恶心” 。f(void)C with Classes
这是在 C、C++ 中声明不带参数的函数的正确方法。
另一方面:
在 C 和 C++ 中有不同的含义!在 C 中,它的意思是“可以接受任意数量的未知类型的参数”,在 C++ 中,它的含义与
foo(void).可变参数函数本质上是不安全的,应尽可能避免使用。
资源
我建议处理类似的语法。
在 C 语言中,函数可以声明为
如您所见,我们有两种声明方式:
parameter-type-listidentifier-list在这种情况下,它
parameter-type-list是强制性的,但它identifier-list是可选的 (_opt)。现在让我们看看它是什么
identifier-list:也就是说,具有
identifier-list此声明的函数:同时,这样的声明在调用时不会对参数的类型和数量施加限制。此外,这样的列表是可选的,即 可能会丢失。
这意味着在调用这样的函数时,您可以传递不同数量的不同类型的参数,即 打电话
foo()或foo(1, 2)合法。让我们去
parameter-type-list:这是参数类型的列表,可能还有标识符:
请参阅以下标准:
也就是说,声明一个不带参数的函数有一种特殊情况——一个
void没有名称的类型参数:对于这样的函数,调用
foo(1, 2)不再正确,与identifier-list.现在,关于 C++。C++ 有一种声明函数的方法:
有一个规则:
也就是说,对于 C++ 声明
是完全等价的。
还有一点历史。Bjorn Stroustrup 的书“C++ 的设计和演变”的节选:
这样编译器就不骂了,按照标准,函数接受的参数必须要描述,如果不存在,
void则为空/无参数。尝试在不
void使用 keys的情况下构建代码,密钥(gcc 或 clang)-Wall -Wextra -pedantic对语言C很有用,您将看到编译器的反应。-Wstrict-prototypes查看编译器开关以获取有关您自己的代码的更多信息可能会很有用。
例如,分析您自己的代码的重要键:
-墙
-Wpedantic
-Wextra
-一切
-Werror -pedantic-errors
历史参考: