2014-12-05 113 views
2

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

+1

所有这些关于“C标准如何允许这样做”的gcc问题令人讨厌...... **如果不用'gcc -std = c11 -pedantic-errors'进行编译,那么gcc不是严格的符合C编译器**,但是是一个非标准的编译器,它针对大量奇怪的GNU扩展进行编译。 – Lundin 2014-12-05 07:45:09

+0

在编译之前先启用所有的警告http://stackoverflow.com/questions/26488502/which-section-in-c89-standard-allows-the-implicit-int-rule http://stackoverflow.com/questions/8440816/警告隐式声明的功能http://stackoverflow.com/questions/8220463/c-function-calls-understanding-the-implicit-int-rule – 2014-12-05 10:05:24

+0

@Lundin我应该使用这个,而不是'gcc -std = c90 -pedantic-errors'?维基百科使得它听起来像c11不支持,直到gcc版本4.6。 http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29我已经提供了我使用的版本。 – cokedude 2014-12-06 00:26:19

回答

4

此代码使用早期C的一个过时特征,称为隐式int。它的唯一用途是在代码高尔夫比赛中。事实上,甚至可以用这种方式来声明变量。变量Ÿ可能很容易被宣布

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是完全一样的东西。世界两个半球都需要一段时间才能达成一致。时区和经络等。这是相同的标准。

1

它不编译。如果你不告诉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] 
} 
+0

同样,'-std = c99 -pedantic-errors'也不会编译。 – Lundin 2014-12-05 07:54:45

0

@lundin,请注意:

main() 

不等同于

int main(void) 

因为无效意味着没有参数,但()表示有可以是任何数量的参数。