Main function
主要功能
程序应包含一个名为main
,这是程序指定的开始。
int main () { body } | (1) | |
---|---|---|
int main (int argc, char *argv[]) { body } | (2) | |
int main (int argc, char *argv[] , other_parameters ) { body } | (3) | |
argc | - | Non-negative value representing the number of arguments passed to the program from the environment in which the program is run. |
---|---|---|
argv | - | Pointer to the first element of an array of pointers to null-terminated multibyte strings that represent the arguments passed to the program from the execution environment (argv0 through argvargc-1). The value of argvargc is guaranteed to be 0. |
body | - | The body of the main function |
other_parameters | - | Implementations may allow additional forms of the main function as long as the return type remains int. A very common extension is passing a third argument of type char*[] pointing at an array of pointers to the execution environment variables. |
名字argc
和argv
是任意的,以及参数类型的表示:int main(int ac, char** av)
同样有效。
解释
大main
函数在程序启动后调用。初始化具有静态的非本地对象的存储时间中执行的程序的指定入口点。托管
环境%28,即操作系统%29。进入点独立自主
程序%28引导加载程序,操作系统内核等%29是实现定义的。
主函数的两个参数形式的参数允许从执行环境%28传递任意多字节字符串--通常称为命令行参数
%29,指针argv[1] .. argv[argc-1]
指向每个字符串中的第一个字符。argv[0]
指向以空结尾的多字节字符串的初始字符的指针,该字符串表示用于调用程序本身%28或空字符串的名称。""
如果执行环境%29不支持这一点。字符串是可修改的,尽管这些修改不会传播回执行环境:例如,可以使用std::strtok
所指向的数组的大小。argv
至少是argc+1
最后一个元素,argv[argc]
,则保证为空指针。
大main
函数有几个特殊性质:
1%29程序中任何地方都不能使用它。
尤其是%29,不能递归调用它。
B%29其地址不能使用
2%29它不能预定义,也不能重载:实际上,名称main
在全局命名空间中,保留给函数%28,尽管它可以用于命名类、命名空间、枚举和非全局命名空间中的任何实体,但称为“main
”的函数不能用C声明。语言链接自C++17%29%29以来的任何命名空间%28
3%29不能定义为删除或用C声明语言链接%28自C++17%29,内联,,,静态,或司法官
4%29主体函数不需要包含返回语句*如果控制达到main
如果没有遇到返回语句,则执行return 0;
...
5%29执行返回%28或到达主%29结尾时的隐式返回,相当于首先保留函数%28,该函数破坏具有自动存储持续时间%29的对象,然后调用std::exit
的参数与回归.%28std::exit
然后销毁静态对象并终止程序%29
6%29如果主函数是用功能试块,静态对象%28的析构函数引发的异常被隐含的std::exit
%29没有被它捕获。
7%29%28自C++14%29以来,主函数的返回类型不能被推断为%28auto main() {...
不允许%29
注记
将OS命令行中给定的参数转换为多字节数组的方式。argv
可能涉及实现定义的处理:
- 解析C++命令行参数MSDN
- 贝壳游戏攻略POSIX
另见
C主要职能文件
*。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。