0%

C语言main函数参数

呃呃

1.定义

C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。

C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:

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

·argc表示参数个数

·argv[0]表示自身运行目录路径和程序名,argv[1]指向第一个参数,argv[2]指向第二个参数……

程序源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char **argv)
{
string str;
cout<<"argc:"<<argc<<endl;
for (int i = 0; i != argc; ++i)
{
cout << "arg[" << i << "]" << argv[i] << endl;
}
return 0;
}

2.执行

在linux终端上执行:

1
2
3
~/SEC Intrdoction/PWNPr » cd "/home/lbh/SEC Intrdoction/PWNPr/" && g++ t1.cpp -o t1 && "/home/lbh/SEC Intrdoction/PWNPr/"t1         lbh@nexusvm
argc:1
arg[0]/home/lbh/SEC Intrdoction/PWNPr/t1

改变参数结果如下:

3.常见形式

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

(1)是(3)的简写。不推荐使用。

(2)是(3)的简写。在C++中是正确的形式。

(3)在C和C++中都是正确的形式。推荐使用。(还有缺省int的main(void)形式)。

(4)和(5)是不用参数时的一种写法。编译器级别高时会警告。不推荐使用。

(6)是(7)的另外写法。两种都可以,凭个人爱好。

(7)是带参数的正确的形式。推荐使用。

(8)是一种很少用的写法,且受系统限制。第三个参数用来在程序运行时获取系统的环境变量,操作系统运行程序时通过envp 参数将系统环境变量传递给程序。

不支持的原因如下:

Because ISO C specifies that the main function be written with two arguments, and because this third argument provides no benefit over the global variable environ, POSIX.1 specifies that environ should be used instead of the (possible) third argument. Access to specific environment variables is normally through the getenv and putenv functions instead of through the environ variable. But to go through the entire environment, the environ pointer must be used.

上面这段话的意思主要是说:ISO C都说明了main函数必须要2个参数,因为第三个参数对全局变量没有任何好处,所以POSIX.1指出参数environ除了作为第三个参数不能有其余的用途。针对某个特定环境一般使用getenv和putenv这两个函数而不是environ变量。如果想遍历整个环境,必须要用environ参数。

ISO C C++ ,POSIX 标准都不支持main 三个参数的定义形式,VC 和GNU编译器都扩展了main 函数的定义,所以目前可以这样使用。

✋如果要编写更加可移植的程序,应该使用全局环境变量environ 来代替envp的作用,如果要访问特定的环境变量,应该使用getenv 和putenv 函数

(9)一般不认为是正确的写法。但是在嵌入式系统中有使用(包括void main()形式)

4.PDF附件

-------------本文结束感谢您的阅读-------------
请作者喝一杯蜜雪冰城吧!