我正在学习c,到现在为止我已经提出了许多小程序。但是我注意到主要功能中的很多都是这样开始的:
main()
{
//code
}
或
int main()
{
//code
return 0;
}
或
int main(void)
{
//code
return 0;
}
那么,我该怎么用?或者哪种方式最好?感谢名单!
答案 0 :(得分:4)
对于标准C
对于托管环境(这是正常环境),C99标准 表示:
5.1.2.2.1程序启动
程序启动时调用的函数名为
main
。该实现声明此函数没有原型。应该是 使用返回类型int
定义并且没有参数:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可以使用任何名称,因为它们是函数的本地名称 宣布):int main(int argc, char *argv[]) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。
9)因此,
int
可以替换为定义为int
的typedef名称,或者argv
的类型可以写为{{1}和,和 等等。
这(在C89中有效)char **argv
隐含地意味着(先前)main()
。但是, C99 中已放弃默认的返回类型规则。也:
int main(void)
表示 - 函数main()
采用未指定的数量的参数。
main
表示“功能main(void)
采用无参数。
答案 1 :(得分:2)
你的第一个例子使用了从过时的C方言继承的特征,该特征早于第一个ANSI(1989)和ISO(1990)标准:即你可以编写一个不指定其返回类型的函数,在这种情况下,类型默认为int
。
在早期的C中,void
关键字和关联类型不存在。当程序员想要编写程序时("具有副作用但不返回任何内容的函数"),他们使用此功能对其进行模拟。他们编写了一个函数,没有任何关键字指定返回类型。它们允许函数执行它的最后一个语句而不返回一个值(或者,他们使用return;
从中间退出而不提供值),并且他们编写了对函数的调用,使得这些调用没有尝试使用返回值:
parse_input() /* similar to a procedure in Pascal, but fake! */
{
/* ... */
if (condition())
return; /* no value */
/* ... */
/* fall off end here */
}
int main()
{
parse_input(); /* no return value extracted, everything cool! */
return 0;
}
不幸的是,一些程序员也开始不关心程序的终止状态,并在此过程样式中编写main
本身:
main()
{
/* do something */
/* fall off the end without returning a value */
}
(也存在混合样式:省略int
声明符但返回整数值。)
这些程序未能返回值具有不确定的终止状态。对于操作系统,它们的执行可能看起来成功或失败。 试图依赖此类程序的终止状态的脚本编写者有祸了!
然后事情变得更糟。 C ++出现并引入了void
,它被采用到C中。使用C ++中的void
关键字,可以声明一个实际上不返回任何内容的函数(并且使得{{1任何其他类型的函数中的语句)。曾经写过没有返回类型的return;
的虚拟程序员得到了笨蛋,并开始坚持这个新的,新鲜的C ++ main
在前面:
void
此时他们忘记了当他们写void main() /* yikes! */
{
/* do something */
/* fall off the end without returning a value */
}
时,它实际上意味着main()
,这使得该函数与环境调用的启动调用具有兼容的类型(除了忽视返回一个值)。现在他们实际上有一个与预期函数类型不同的函数类型,甚至可能都没有被成功调用!
现在的情况是,在C ++和最新的C ++标准中,int main()
仍然需要返回main
。但是这两种语言都对原来的虚拟程序员做出了让步:你可以让执行失败了#34; int
的结尾,行为就像在那里执行main
一样。所以这个简单的程序现在已经成功终止了C99的终止状态,我认为是C ++ 98(或者可能更早):
return 0;
但是这两种语言都没有让第二代数字程序员(以及那些读过那些程序员在1980年及以后写过的C书的其他人)做出让步。也就是说,int main()
{
}
不是void
的有效返回声明者(除非平台记录为被接受,并且仅适用于那些平台,而不适用于可移植语言)。
哦,并且在C99中从C中删除了缺少声明符的余量,因此{C}的新方言中main
不再正确,并且不是有效的C ++。顺便说一下,C ++在其他地方确实有这样的语法:即,类构造函数和析构函数不需要具有返回类型说明符。
好的,现在约为main() { }
与()
。回想一下,C ++引入了(void)
。此外,虽然C ++引入了void
,但它没有引入void
参数语法。更严格类型的C ++引入了原型声明,并且放弃了非原型函数的概念。 C ++改变了(void)
C语法的含义,使其具有声明的能力。在C ++中,()
声明一个没有参数的函数,而在C中,int func();
不做这样的事情:它声明了一个我们不知道参数信息的函数。当C采用int func();
时,委员会有一个丑陋的想法:为什么我们不使用语法void
声明一个没有参数的函数,然后(void)
语法可以保持向后兼容松散的goosey传统行为迎合无类型编程。
你可以猜到接下来发生了什么:C ++人员看了这个()
黑客,为了跨语言兼容性而放弃了他们的手臂并将其复制到C ++中。当你看到今天语言如何分歧并且基本上不再关心这种程度的兼容性时,后见之明是惊人的。所以(void)
明确表示"在C和C ++中声明没有参数"。但是在C ++代码中使用它显然是纯C ++从来没有打算成为C是丑陋的,而且风格很差:例如,在类成员函数上!写(void)
当然,当你定义像class Foo { public: Foo(void); virtual ~Foo(void) /*...*/ };
这样的函数时,定义的函数没有参数,无论它在哪种语言中。不同之处在于声明信息是什么引入范围。在C中,我们可以有一个荒谬的情况,即函数可以在程序文本的同一单元中完全定义,但尚未声明!
当我们编写int main() { ... }
时,通常不会从程序中调用它,因此它不会重要定义所声明的内容。 (在C ++中,不能从程序中调用main
;在C中它可以是)。因此,无论您是使用C还是C ++,无论是编写main
还是int main()
都无关紧要。调用int main(void)
的东西看不到它的任何声明(无论如何你在程序中写的)。
所以请记住,如果你写:
main
然后虽然它是完美的C ++和正确的C,但它有一个轻微的风格瑕疵:你正在编写一个旧式的ANSI-C之前的功能,它不能作为原型。虽然在int main() /* rather than main(void) */
{
}
的情况下它在功能上并不重要,但如果您以某种方式使用某些编译器,则可能会收到警告。例如,GCC,main
选项:
-Wstrict-prototypes
因为在{C}编程时打开test.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
是一个非常有用的警告,为了提高类型安全性(以及-Wstrict-prototypes
),我们努力消除编译工作中的警告,它应该是理所当然的我们写:
-Wmissing-prototypes
将使诊断消失。
如果您希望int main(void) /* modern C definition which prototypes the function */
{
}
接受参数,那么参数名称由main
决定。
在C ++中,您可以省略参数名称,因此这个定义是可能的,它可以很好地代替int main(int argc, char **argv)
。
main()
由于参数向量是以空指针终止的,因此您不需要int main(int, char **) // both arguments ignored: C++ only
{
}
,而C ++允许我们在不引入未使用的变量的情况下表达:
argc
答案 2 :(得分:1)
您应该使用以下4种选择中的一种:
int main(void);
int main();
int main(int argc, char **argv);
int main(int argc, char *argv[]);
通常使用名称argc
和argv
; 可以更改它们,但不能。
注意从不使用生产代码中经常出现的void main(void);
。
答案 3 :(得分:1)
首先:
声明一个函数main - 没有输入参数。虽然main应该有返回(你的编译器会处理这个)
<强>第二/第三强>
声明一个函数main,它返回一个int并且不接受任何输入参数
您应该使用第3种格式。 相反,这是最好的方式:
int main(int argc, char *argv[]){
return 0;
}
答案 4 :(得分:0)
默认情况下,main函数返回一个整数类型,因此它的“int main()”或者你可以简单地给出“main()”
“main(void)”与“main()”相同,它告诉编译器main函数没有参数。
如果您想通过main函数传递参数:
int main(int argc, char *argv[]){
return 0;
}
答案 5 :(得分:0)
main(){}
以上行给出错误。 c中任何函数的默认返回类型都是int。由于上面的代码没有返回任何内容,它会给你一个错误。
int main(){
//body
return 0;
}
在上面的代码中,它满足所有要求,因此上面的代码将运行。在上面的代码中,我们在函数中不传递任何参数。所以这个函数可以处理全局变量和局部变量。
int main(void)
{
//code
return 0;
}
在上面的代码中,我们在函数中没有传递参数。但是指定void
告诉编译器它不接受任何参数。 void
是参数的默认数据类型,表示无输入。