main()与exit()

main函数

函数返回值

  c语言约定,main函数的返回值为0时表示函数运行成功,正常情况下,如果省略return 0,编译器会自动添加

1
2
3
4
5
6
7
int main() {
printf("hello");

// 编译运行未报错
// 编译器会自动添加
// return 0;
}

main函数形参

  main函数可以添加形参,其中argc全称是argument count,代表argv中元素的个数,argv的全称是argument value,代表参数值,它是一个指向字符串的指针数组

1
2
3
4
5
int main(int argc, char* argv[]) {
printf("hello");

return 0;
}

  将如下代码写入到demo1.c

1
2
3
4
5
6
7
8
9
10
int main(int argc, char* argv[]) {

printf("argc = %d\n", argc);

for (int i = 0; i < argc; ++i) {
printf("argv[%d] = %s\n", i, argv[i]);
}

return 0;
}

  使用gcc编译

1
gcc demo1.c -o demo1

  运行编译好的程序

1
demo1 val1 val2 val3

  控制台中输出;可以看到会多传入一个文件名作为默认的参数

1
2
3
4
5
argc = 4
argv[0] = demo1 # 系统自己传入的参数
argv[1] = val1
argv[2] = val2
argv[3] = val3

  在intellij Clion中可以配置main方法接收的参数,运行时将自动传入

exit函数

结束程序执行

  main函数结束时也会隐式调用exit函数,在main函数中,exit函数等价于return

  exit属于stdlib.h库,用于结束函数的执行并向外部返回一个值,该返回值就是它的参数,通常使用两个常量EXIT_SUCCESSEXIT_FAILURE作为参数,相当于01,分别代表正常结束异常终止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main() {

test1();
// test2不会被执行
test2();

return 0;
}

void test1() {
printf("hello\n");
// 将不会执行exit之后的代码
exit(EXIT_SUCCESS);
}

void test2() {
printf("hi\n");
}

结束时调用方法

  在exit执行前执行atexit,函数,并传入一个函数指针,指针指向的函数将在exit结束前被调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {

test1();
test2();

return 0;
}

void test1() {
printf("hello\n");

// 结束前调用test3
atexit(test3);
exit(0);
}

void test2() {
printf("hi\n");
}

void test3() {
printf("bye");
}