前言:本文程序代码均在Windows + mingw64环境下编译完成(gcc)
C语言的main函数有两个标准写法
// C99加入两种 main 标准写法
int main(void) // 标准一写法
// 和
int main(int argc,char *argv[]) // 标准二写法
int main(int argc,char **argv) // 等介于标准二写法
// ==================================================
// 但C99之前就比较随便了,如下边两种写法比较常见于VC6.0(C89)
main()
void main() // 单片机上这种写法比较多,因为不用返回给系统
main函数返回值说明
从C99开始,规定main函数必须返回一个int变量值,其值是返回给系统用的
main函数的返回值,用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
返回非零值代表程序异常退出,而main函数给返回个0,则表示“非异常退出”,即正确执行并退出。
正常情况下写的C语言程序则可以从如下代码开始:
#include <stdio.h>
int main(int argc, char* argv[])
{
// 我要写的程序代码开始位置
return 0; // 执行正确并退出
}
// 或
#include <stdio.h>
int main(void)
{
// 我要写的程序代码开始位置
return 0; // 执行正确并退出
}
main函数返回值应用举例
很多时候要完成一个问题,需要几个程序按顺序的去执行,如果有一个程序执行错误,后边的程序就不执行了。
这里有两个简单的C语言程序
程序1:
// Hello.c
#include <stdio.h>
int main(void)
{
printf("Hello\n");
return 0; // 返回个正确执行并退出值
}
程序2:
// World.c
#include <stdio.h>
int main(void)
{
printf("World\n");
return 1; // 返回个非零值(错误值)
}
对这两个程序进行编译和执行,显示如图:
echo %ERRORLEVEL% // 为输出上一次程序执行的返回值
Linux系统下为:echo $?
接着多个程序的执行,执行过程如下:
# 第一次执行两个程序
E:\测试时间>Hello.exe && World.exe
Hello
World
# 第二次执行两个程序(顺序换一下)
E:\测试时间>World.exe && Hello.exe
World
E:\测试时间>
执行过程说明:
- 第一次执行:Hello.exe && World.exe 两个程序都执行且输出相应的字符串
- 第二次执行:World.exe && Hello.exe 只有World.exe执行输出,而Hello.exe并没有执行输出
&& 说明:连接二个命令的。前面的命令执行正确后才会执行后面的命令。
实例(获取被调用程序返回值)
在实际应用程序开发过程中,经常会调用到其它程序来完成一些事情,比如很多程序会调用nmap这款著名的扫描程序等。
这里简单举例一下调用外部程序执行
被调用程序源代码(辅程序):
// tex.c
#include <stdio.h>
#include <conio.h>
int main(int argc,char *argv[])
{
printf("Hello World!\n");
for(int i = 0; i<argc; i++)
{
printf("argv[%d]:%s\n",i,argv[i]); // 打印程序参数
}
getch(); // 暂停一下,免得程序一闪而过
return 0;
}
调用程序源代码(主程序):
// wo.c
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main(void)
{
DWORD dwExitCode = 0;
SHELLEXECUTEINFO ShExecInfo = {0}; // ShellExecuteEx调用例程及定义
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = ("open");
ShExecInfo.lpFile = ("tex.exe");//要调用程序的文件
ShExecInfo.lpParameters = ("我要给tex程序的参数 >><<");//传递给要调用执行程序的参数
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo); // 可生成句柄,供WaitForSingleObject调用
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);//获取程序执行返回的结果
printf("Exit code(Read) : %d\n", dwExitCode);
return 0;
}
编译程序:
执行程序,调用过程:
被调用程序执行完后,返回调用程序的显示结果:
后语
main函数的返回值是个比较重要的环节,最好养成一个好习惯。
在很多新手里最多使用的是:“return 0” 不管程序是执行正确还是错误,统统都是:“return 0”,比较不好的习惯。
实际上可以自定义返回值,根据不同情况返回不同值,方便程序执行过程中就可以得知程序是那个环节出现问题等。
而程序最好使用 int main(int argc,char *argv[]) 来定义自己的程序入口,让参数来完成相应的功能,而不是打开程序就执行程序全部功能,方便以后调用自己的程序。