c - 程序编译有错误

标签 c gcc

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

#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 的一个已过时的功能,称为“隐式 int”。它的唯一用途是在代码高尔夫比赛中。事实上,甚至变量也可以这样声明。变量y可能很容易被声明

static y = 5;

可以在没有原型(prototype)化的情况下调用函数。假定该函数准确接收传递的参数数量,但受“通常的提升”影响。任何小于 int 的类型都会提升为 int,而 float 则会提升为 double

因此,这些函数的行为就像它们的原型(prototype)是:

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

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


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

gcc -ansi
gcc -std=c99

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


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

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

关于c - 程序编译有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27310553/

相关文章:

linux - 如何在 Linux Mint 中构建 evpp

c++ - 指向未指定大小 "(*p)[]"的数组的指针在 C++ 中非法但在 C 中合法

ios - Apple Mach-O 链接器错误_

programming-languages - 在 "Scanf"中观察到一个新事物

c - 缓冲区与字符串比较(没有换行符)

c++ - 为什么 gcc 提示 "declaration of ' foo' 隐藏了之前的调用 [-Werror=shadow]”

c++ - 使用 gcc 8.2.1 时出现 strncat Wformat 溢出警告

使用 MinGW32 GCC 编译。只告诉链接库一次?

c++ - 在 GOP(图片组)结束处剪切 MPEG 2 视频的 C 代码

c++ - __cplusplus < 201402L 在 gcc 中返回真,即使我指定了 -std=c++14