我知道main函数的签名是:
int main(int argc, char **argv);
但我真的不知道为什么像这样的主要功能也能正常工作:
main(a){}
这里为什么能出现 'a'?为什么编译器没有报错?因为在使用 'a' 之前,我没有声明它。
我知道main函数的签名是:
int main(int argc, char **argv);
main(a){}
这里为什么能出现 'a'?为什么编译器没有报错?因为在使用 'a' 之前,我没有声明它。
这是旧版 C 代码的一个特性,称为“隐式 int”。任何未指定类型的变量都被假定为 int
类型。同样地,任何未指定返回类型的函数都被假定为返回 int
类型。虽然现在已经被视为不推荐使用,但在混淆代码和代码高尔夫中仍然有用。
因此,您应该将其读作
int main(int a) {}
这里省略了 int
,因为它们是隐式的。
正如 WhozCraig 提到的那样,从标准的角度来看,这是不符合规范和不可移植的。但实际上,在非规范模式下,很多编译器都可以让你这么做。
然而,隐式的 int
行为并不能让你避免声明变量。
main(a){
b,c; // int declarations
c = 5;
b = c + 10;
d = b; // No! d is not declared for you, even with implicit int happening.
return 0;
}
main()
是一个实现定义的问题。它不符合 C99 §5.1.2.2.1 中规定的两个必需允许项,即int main(void)
和int main(int argc, char *argv[])
。标准中列出的第三个选项,“或以其他一些实现定义的方式。”因此是唯一可允许的替代方案。 - WhozCraig