【问题标题】:program compiles with errors程序编译错误
【发布时间】:2014-12-05 07:00:37
【问题描述】:

这个程序违背了我在 C 中所学的一切。它是如何编译的?为什么这不需要是 int main ?为什么不返回0?您不需要在 main 上方声明 sub() 的初始声明吗?这让我大吃一惊。我喜欢将我的功能保持在 main 之上。

#include <stdio.h>

main()
{
   sub ();
   sub ();
}

sub()
{
   static int y = 5;
   printf(" y is %d \n",y);
   y++;
}

gcc 版本为:

gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)

这似乎是一个旧版本,但还不算老。

https://www.gnu.org/software/gcc/releases.html

如何检查这是 c90 还是 c89?

【问题讨论】:

标签: c gcc


【解决方案1】:

这段代码使用了早期 C 的一个过时的特性,称为 implicit int。它的唯一用途是在代码高尔夫比赛中。事实上,甚至变量也可以这样声明。变量 y 可能很容易被声明

static y = 5;

一个函数可以在没有原型的情况下被调用。假设该函数准确地接收传递的参数数量,受“通常的促销”的影响。任何小于 int 的类型都被提升为int,浮点数被提升为double

所以函数的行为就好像它们被原型化为:

int main(void);
int sub(void);

要返回int 以外的任何类型,必须指定返回类型。


您可以在编译时指定您希望使用的标准。

gcc -ansi
gcc -std=c99

并添加-pedantic 让 gcc 相信你是认真的。


奇怪的是,这段代码并不严格符合任何标准。 C99 不允许隐式 int,但允许从 main 中删除 return 0;。 C90 或“ansi”C 允许隐式 int,但需要 return。所以,肯定会有回报。

顺便说一句,C89 和 C90 完全一样。世界的两个半球花了一段时间才达成一致。时区和子午线等。这是相同的标准。

【讨论】:

    【解决方案2】:

    它不会编译。如果你不告诉 gcc 是一个严格符合 C 的编译器,而只是用gcc test.c 调用它,那么它将仍然是一个完全非标准的编译器,它允许很多奇怪的事情。保留其默认设置时,它不符合任何已知的 C 标准。

    gcc -std=c11 -pedantic-errors 给出:

    test.c:3:1: error: return type defaults to 'int'
     main()
     ^
    test.c: In function 'main':
    test.c:5:4: error: implicit declaration of function 'sub' [-Wimplicit-function-d
    eclaration]
        sub ();
        ^
    test.c: At top level:
    test.c:9:1: error: return type defaults to 'int'
     sub()
     ^
    test.c: In function 'sub':
    test.c:14:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
    

    【讨论】:

    • 同样,-std=c99 -pedantic-errors 也不会编译。
    【解决方案3】:

    @lundin,请注意:

    main()
    

    不等于

    int main(void)
    

    因为 void 表示没有参数,而 () 表示可以有任意数量的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多