这个程序违背了我在 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/