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

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

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

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

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

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

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

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

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

从而:

 extern a; main(argc, argv) char **argv; { auto i; ... return 0; } 

和其他符合现代标准的编码风格是允许的。 (变量a是一个int ;参数argc是一个int ;变量i是一个int ; main()的返回类型是一个int 。)注意,直到C99,你不应该离开return 0; 来自main() ; 如果你这样做,返回到调用环境的值是未定义的。