`main` 函数和命令行参数 (C++)

您所在的位置:网站首页 main函数的三个参数 `main` 函数和命令行参数 (C++)

`main` 函数和命令行参数 (C++)

#`main` 函数和命令行参数 (C++) | 来源: 网络整理| 查看: 265

main 函数和命令行参数 项目 03/03/2023

所有 C++ 程序都必须具有 main 函数。 如果尝试在没有 main 函数的情况下编译 C++ 程序,编译器将引发错误。 (动态链接库和 static 库没有 main 函数。)main 函数是源代码开始执行的位置,但在程序进入 main 函数之前,没有显式初始值设定项的所有 static 类成员都设为零。 在 Microsoft C++ 中,全局 static 对象在进入 main 前也进行初始化。 一些限制适用于 main 函数,而不适用于任何其他 C++ 函数。 main 函数:

无法重载(请参阅函数重载)。 无法声明为 inline。 无法声明为 static。 无法提取其地址。 无法从程序调用。 main 函数签名

main 函数没有声明,因为它内置于语言中。 如果有,则 main 的声明语法如下所示:

int main(); int main(int argc, char *argv[]);

如果 main 中未指定返回值,编译器会提供零作为返回值。

标准命令行参数

main 的参数可进行方便的命令行分析。 argc 和 argv 的类型由语言定义。 名称 argc 和 argv 是传统名称,但你可以按自己的意愿命名。

自变量定义如下所示:

argc 包含 argv 后面的参数计数的整数。 argc 参数始终大于或等于 1。

argv 表示由杂注用户输入的命令行自变量的以 null 结尾的字符串的数组。 按照约定,argv[0] 是用于调用程序的命令。 argv[1] 是第一个命令行参数。 命令行的最后一个参数是 argv[argc - 1],并且 argv[argc] 始终为 NULL。

有关如何禁用命令行处理的信息,请参阅自定义 C++ 命令行处理。

备注

按照约定,argv[0] 是程序的文件名。 但在 Windows 上,可以使用 CreateProcess 来生成进程。 如果同时使用了第一个和第二个参数(lpApplicationName 和 lpCommandLine),则 argv[0] 可能不是可执行名称。 可使用 GetModuleFileName 来检索可执行名称及其完全限定的路径。

特定于 Microsoft 的扩展

以下部分介绍特定于 Microsoft 的行为。

wmain 函数和 _tmain 宏

如果将源代码设计为使用 Unicode 宽 character,则可以使用特定于 Microsoft 的 wmain 入口点,即宽 character 版的 main。 下面是 wmain 的有效声明语法:

int wmain(); int wmain(int argc, wchar_t *argv[]);

还可以使用特定于 Microsoft 的 _tmain,它是 tchar.h 中定义的预处理器宏。 除非定义了 _UNICODE,否则 _tmain 解析为 main。 在该示例中,_tmain 将解析为 wmain。 对于需要分别生成窄版和宽版 character 集的代码来说,_tmain 宏和以 _t 开头的其他宏非常有用。 有关详细信息,请参阅使用一般文本映射。

从 main 返回 void

main 和 wmain 函数作为 Microsoft 扩展,可以声明为返回 void(没有返回值)。 此扩展在其他一些编译器中也可用,但不建议使用它。 当 main 不返回值时,它可用于保持对称。

如果将 main 或 wmain 声明为返回 void,则无法使用 return 语句将 exit 代码返回到父进程或操作系统中。 若要在将 main 或 wmain 声明为 void 时返回 exit 代码,则必须使用 exit 函数。

envp 命令行参数

main 或 wmain 签名允许可选的 Microsoft 特定扩展访问环境变量。 此扩展在 Windows 和 UNIX 系统的其他编译器中也很常见。 名称 envp 是传统名称,但你可以根据自己的意愿命名环境参数。 下面是包含环境参数的参数列表的有效声明:

int main(int argc, char* argv[], char* envp[]); int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

envp 可选 envp 参数是表示用户环境中设置的变量的字符串数组。 该数组由 NULL 项终止。 它可以声明为指向 char (char *envp[]) 的指针数组,也可以声明为一个指针来指向多个指向 char (char **envp) 的指针。 如果程序使用 wmain 而不是 main,请使用 wchar_t 数据类型而不是 char。

传递给 main 和 wmain 的环境块是当前环境的“冻结”副本。 如果随后通过调用 putenv 或 _wputenv 来更改环境,则当前环境(由 getenv 或 _wgetenv 以及 _environ 或 _wenviron 变量返回)将发生更改,但 envp 指向的块不会更改。 有关如何禁用环境处理的更多信息,请参阅自定义 C++ 命令行处理。 envp 参数与 C89 标准兼容,但与 C++ 标准不兼容。

main 的示例参数

下面的示例演示如何使用 main 的 argc、argv 和 envp 变量:

// argument_definitions.cpp // compile with: /EHsc #include #include using namespace std; int main( int argc, char *argv[], char *envp[] ) { bool numberLines = false; // Default is no line numbers. // If /n is passed to the .exe, display numbered listing // of environment variables. if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 ) numberLines = true; // Walk through list of strings until a NULL is encountered. for ( int i = 0; envp[i] != NULL; ++i ) { if ( numberLines ) cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3