考虑这两个函数定义:
void foo() { }
void foo(void) { }
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?
什么是更好的:void foo()或void foo(void)?随着虚空,它看起来丑陋和不一致,但我被告知它是好的.这是真的?
编辑:我知道一些旧的编译器做了奇怪的事情,但如果我只使用GCC,那void foo()好吗?将foo(bar);随后被接受?
当C函数不接受任何参数时,是否必须通过语言规则使用"void"参数声明/定义它?当参数列表中没有任何内容时,PC-Lint似乎有问题,我想知道它是否是我不知道的语言语法中的东西.
编辑:我刚发现一个重复的(后面的傻瓜?它首先出现)问题,C void参数,它有更多的答案和解释.
我知道 \xe2\x80\x9c函数声明符中的空列表不是该函数定义的一部分,指定不提供有关参数数量或类型的信息\xe2\x80\x9e [1]:
\n// No information about the parameters is supplied.\nint foo();\nRun Code Online (Sandbox Code Playgroud)\n我知道 \xe2\x80\x9c函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数\xe2\x80\x9e [2]。
\n// In this case the foo() function has no parameters.\nint foo()\n{\n // ...\n}\nRun Code Online (Sandbox Code Playgroud)\n我知道 \xe2\x80\x9c类型的未命名参数的特殊情况void作为列表中唯一的项目指定该函数没有参数\xe2\x80\x9e [3]:
// foo() has no parameters.\nint foo(void);\n\n// bar() has no parameters.\nint bar(void)\n{\n // ...\n};\nRun Code Online (Sandbox Code Playgroud)\n所以这里有一些问题:
\n合法吗int main() { /* ... …
摆弄C的旧奇怪兼容行为时,我最终得到了这段代码:
#include <stdio.h>
int f();
int m() {
return f();
}
int f(int a) {
return a;
}
int main() {
f(2);
printf("%i\n", m());
}
Run Code Online (Sandbox Code Playgroud)
我确定f()in 的调用m()是未定义的行为,因为f()应该只使用一个参数,但是:
-Wextra,-Weverything否则GCC 9.1和clang 8.0.1均不显示任何警告(也不显示in 或其他内容)-O3。然后输出为2,不带-O30,带0。在Windows上,MSVC不会输出任何错误,程序只会输出随机数。-O3仍输出0,但正常编译会导致GCC为2,而...则为66688。当出现错误消息时,几乎是您所期望的:(非常有趣,因为a在打印行中没有出现)
foo.c: In function ‘m’:
foo.c:4:9: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
return f();
^~~
foo.c: In function ‘main’:
foo.c:11:2: warning: ‘a’ is …Run Code Online (Sandbox Code Playgroud)