Jen*_*ens 4 c program-entry-point prototype
我无法计算我在那里看过C代码的次数,在这里定义main为
int main() { ...
Run Code Online (Sandbox Code Playgroud)
当我用它编译它
gcc -ansi -pedantic -Wstrict-prototypes -Werror foo.c
Run Code Online (Sandbox Code Playgroud)
它出错了
foo.c:2: warning: function declaration isn't a prototype
Run Code Online (Sandbox Code Playgroud)
为什么会这样
int main(void)
Run Code Online (Sandbox Code Playgroud)
是否需要让错误消失?
因为定义
int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
不包括原型; 它没有指定参数的数量或类型.
这个:
int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
确实包括原型.
使用空括号,您说的是main采用固定但未指定的数字和类型的参数.有了(void),你明确地说它不需要参数.
与前者一样,电话如下:
main(42);
Run Code Online (Sandbox Code Playgroud)
不一定会被诊断出来.
这可以追溯到原型被引入语言之前的ANSI前几天,大多数函数都是用空括号定义的.那时候,写下来是完全合法的:
int foo();
int foo(n)
int n;
{
/* ... */
}
...
foo(42);
Run Code Online (Sandbox Code Playgroud)
当原型被添加到语言中时(借用C++),有必要保留空括号的旧含义; 添加了"new"(这是1989)语法(void),因此你可以明确地说一个函数不带参数.
(C++有不同的规则;它不允许旧式非原型函数,空括号表示函数不带参数.C++允许(void)语法与C兼容,但通常不推荐.)
最佳实践是使用(void),因为它更明确.int main()表格甚至是有效的并不完全清楚,但我从未见过不接受它的编译器.
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |