为什么不删除“int”关键字会在以下代码中生成任何错误

时间:2013-04-12 20:26:34

标签: c

示例程序1.注意第一行int中的typedef

typedef int (*p)(); //Statement 1
int foo()
{
 return 0;
}
int main()
{    int c;
    p q=foo;
    c=(*q)();
    printf("%d",c);
    return 0;
}
Output:0

示例程序2.所有相同,但第一行没有int

typedef (*p)(); //Statement 1
int foo()
{
 return 0;
}
int main()
{    int c;
    p q=foo;
    c=(*q)();
    printf("%d",c);
    return 0;
}
Output:0

两种情况下的输出相同。它不会产生任何错误。为什么呢?

2 个答案:

答案 0 :(得分:3)

您应该始终在诸如此类的问题中发布您正在使用的编译器(和版本)。

我的猜测是你正在使用允许隐式int的C89编译器。

答案 1 :(得分:2)

如果您在C99模式下编译,您将获得诊断,但在C89和标准前C中,关键字int是可选的。

因此:

extern a;

main(argc, argv)
char **argv;
{
    auto i;
    ...
    return 0;
}
允许使用现代标准令人憎恶的其他编码风格。 (变量aint;参数argcint;变量iint;返回类型是main() intreturn 0;。)请注意,在C99之前,您不应该从main()离开{{1}};如果你这样做,返回到调用环境的值是未定义的。