C语言中,main()函数是必须的,称为主函数,它是程序运行的入口,main()函数的形式有多种。
一、第一种形式
int main(void)
{
return 0;
}
int 为返回值,由于没有任何信息传递给main()函数,其参数列表为一个void,表示不接受任何参数。
二、第二种形式
形式较为复杂,如下:
int main(int argc, char * argv[])
{
return 0;
}
它提供一个int类型的返回值。第一个参数是命令行中的字符串数,按照惯例,这个int型参数被命名为argc,但这不是必须的,第二个参是指向传入命令构成字符串的指针数组,执行程序时,每个字符串被存储到内存中,并分配一个指针指向它,然后这些指针构成一个数组,保存再argv中,同样,这个名称也是惯例,不是必须的。怎么使用呢?
实验一:命令行输入
有如下源程序:
// command_line_input.c
#include <stdio.h>
int main( int argc, char * argv[])
{
int index = 0;
printf("Your input are: \n");
while(index < argc) {
printf("%d: %s\n", index, argv[index]);
index++;
}
return 0;
}
对其进行编译,命令如下:
gcc command_line_input.c -o command_line_input.exe
后执行,键入:
command_line_input.exe first second third
回车后,显示如下:
0: command_line_input.exe
1: first
2: second
3: third
由于输入了四个字符串,分别为:
command_line_input.exe
first
second
third
分别将其显示出来,其中可执行文件名是第一个字符串。
三、第三种形式
int main(int argc, char * argv[], char *env[])
{
return 0;
}
前两个参数的含义与第二种形式相同,第三个参数env用于读取系统中的环境变量,并将每个环境变量作为一个字符串对其分配内存,并分配一个指针指向它,然后将这些指针保存在指针数组env中。这个参数的名称来源于unix系统的env命令,该命令在unix或linux系统中用于打印系统环境变量,做实验。
实验二:打印系统环境变量
// print_env.c
#include <stdio.h>
int main(int argc, char * argv[], char *env[])
{
int index = 0;
while(env[index]) {
printf("env[%d]: %s\n", index, env[index]);
index++;
}
return 0;
}
对其进行编译,命令如下:
gcc main_third.c -o main_third.exe
执行后显示:
env[0]: ALLUSERSPROFILE=C:\ProgramData
env[1]: APPDATA=C:\Users\HUAWEI\AppData\Roaming
……
env[50]: windir=C:\WINDOWS
env[51]: ZES_ENABLE_SYSMAN=1
便打印了我的电脑系统中的环境变量。
四、第四种形式
int main()
{
return 0;
}
这种形式中省略了main()中的void,在C语言中,main()函数省略void参数,让括号空着,表示对是否接受参数表示沉默,在C++中省略void与不省略表示含义相同,表示不接受任何参数。
五、第五种形式
main()
{
}
这种形式是著名的K&R中定义的最初形式。我的编译器为gcc(V9.2.0),我们给出一个程序如下,这个程序是K&R中给出的著名的输出hello,world的程序,为了对K&R表示尊重,我们不在程序头部添加函数名的注释行,程序名称命名为hello_world.c。
#include <stdio.h>
main()
{
printf("hello,world\n");
}
编译如下:
gcc hello_world.c -o hello_world.exe
可以生成可执行文件,运行后输出hello,world,但是编译时给出一个warning,提醒main()函数的默认返回类型为int,如下:
hello_world.c:2:1: warning: return type defaults to 'int' [-Wimplicit-int]
2 | main()
如果编译时打开c99开关,编译如下:
gcc --std=c99 hello_world.c -o hello_world.exe
或打开c11开关,,编译如下:
gcc --std=c11 hello_world.c -o hello_world.exe
将得到同样的结果。
六、第六种形式
void main()
{
}
这种形式,没有任何标准考虑过它,但是在我的程序中运行时,没有任何的警告和错误,在普通的电脑端C程序开发中并不建议采用这种形式,在某些特殊场合,如在使用Keil软件进行C51编程时,最常用的就是这种形式,而且Keil官方给出的C51例程中也是使用这种形式,你可以通过Keil软件工程(project)子菜单下的安装目录下的“Open Project”菜单项,打开Keil软件安装目录下“C51->Examples->BLINKY"目录下的BLINKY.Uv2工程查看。
|