在C中声明变量时,如果要声明int
,有时可以省略该类型。
为什么省略参数的显式'int'类型无法在gcc中使用其他非int参数进行编译,除非在K& R样式中声明?
此代码生成错误:
main(argc, char *argv[])
{
/* . . . */
}
使用以下输出:
$gcc XXX.c -oXXX
XXX.c:X:X: error: expected ‘)’ before ‘char’
main(argc, char *argv[])
^
但是,如果我为参数编写K& R样式类型,我可以省略为第一个参数指定int
类型:
main(argc, argv)
char *argv[];
{
/* . . . */
}
编译得很好。
我怀疑原因是在制作第一个C标准时,他们认为K& R automatic-int表示法应该与功能参数的新语法完全分开,特别是因为当标准被拉到一起时automatic-int表示法可能已经被认为是很差的表示法。
我对这些规则的兴趣是学术性的,我一般不会写这种旧式的C.
答案 0 :(得分:3)
编译器使用两种语法之一。
在应用K& R语法时,允许使用未声明的参数,默认为整数。
当应用非K& R语法时,所有参数必须符合参数声明语法,即用类型和名称声明。
通过选择相应的声明样式来调用其中一个。
答案 1 :(得分:3)
C中有两种形式的功能定义:K& R风格和带原型的现代风格。你不能在一个定义中混合它们。
在K& R风格(即1978年第一版Kernighan& Ritchie的“The C Programming Language”中使用的风格,发布于该语言的第一个官方ANSI标准之前11年),您可以写道: / p>
/* Valid in K&R and 1989 ANSI C, invalid in C99 and later */
main(argc, argv)
char *argv[];
{
/* . . . */
}
括号之间的东西只能 是一个(可能是空的)标识符序列,参数的名称。在)
和{
之间,您可以选择使用一系列参数声明,指定其类型。如果省略了参数的类型或函数本身的类型,则默认为int
。
1989 ANSI C标准保留了这种旧形式以实现向后兼容,但宣称它已过时。 (不幸的是,恕我直言,即使在2011年的ISO C标准中也是如此。)
1999 ISO C标准删除了“隐式int”规则,所以即使由于某些奇怪的原因,你想要使用旧式定义,你仍然必须明确地给出所有类型:
/* Valid in all versions of C, but obsolescent */
int main(argc, argv)
int argc;
char *argv[];
{
/* ... */
}
main
的现代原型定义是:
/* Valid in 1989 ANSI C and later; write it this way! */
int main(int argc, char *argv[]) {
/* ... */
}
你应该总是使用原型;编写旧式函数定义是没有充分理由的(除非你使用非常旧的编译器,但是甚至找到这样的编译器也变得很困难。)