2012-11-24 47 views
3

可能重复的区别:
difference between main(void) and main() in c在C:主()和int main()的

我知道这是超级基本和其他一些线程已经谈到了类似的问题。但是我有一本书(C的绝对新手指南),所有的代码都写在函数main()中。 int总是被忽略。这怎么可能运行?这可能是一个老版本的stdio.h吗?
下面是示例代码:

#include <stdio.h> 

main() // not int main() 
{ 
printf("This is it\n"); 
return 0; 
} 
+7

主要区别在于时间。在1984年,可以写'main()'。在2012年,它并不好,但许多编译器接受它的向后兼容性。许多作者认为它仍然是80年代中期。 –

+0

查看http://stackoverflow.com/questions/4260048/c-function-defined-as-int-but-having-no-return-statement-in-the-body-still-compi – onon15

+2

@WilliamPursell - 绝对不是这个问题的重复。这里的问题不*与* main(void)有任何关系。 – Flexo

回答

3

我认为c89标准将允许main()但c99和以上不会。您必须使用int main()否则。

+0

而我得到了c99。现在,为什么我的编译器不喜欢它是有道理的。谢谢。 – Martin

+0

btw尝试了这本书的C: [链接](http://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628) –

+1

其实你应该使用int main(void) '。 – effeffe

1

main()的作品,但令人困惑,在C主要函数总是返回一个int,指定退出状态,所以正确的语法是int main(),但如果你不刻意去设置退出状态,然后main()就够了,但好的C书总会有int main()

1

这些类型的问题是高度依赖于标准版本的,因此一般答案没有多大意义。

从C89草案(纠正我,如果官方C89标准是不同的,它不是自由avalaible):

称为在程序启动的功能被命名为主力。 该实现声明此函数没有原型。 它可与无参数来定义:

int main(void) { /*...*/ }

或具有两个参数(此处称为argc和argv,尽管可以使用任何名称,因为它们是本地的,其中声明它们的功能):

int main(int argc, char *argv[]) { /*...*/ }

C99和C11的标准说的一样,但他们在添加的东西和:

或等同物; [9]或以某种其他实施方式定义的方式。

[9]因此,int可以被定义为int的typedef名称替代,或者argv的类型可以被写为char ** argv,依此类推。

在一般的东西不是从标准定义会导致不确定的行为,这样的代码是UB在C89/C90,它可能是有效的C99和C11,但那是实现定义的。

P. S .:如您所见,您还应该在参数列表中添加void,没有它的行为定义如上。

相关问题