在cppreference.com上我找到了以下代码示例:
#include <iostream>
#include <string_view>
// Print a string surrounded by single quotes, its
// length and whether it is considered empty.
void check_string(std::string_view ref)
{
std::cout << std::boolalpha
<< "'" << ref << "' has " << ref.size()
<< " character(s); emptiness: " << ref.empty() << '\n';
}
int main(int argc, char **argv)
{
// An empty string
check_string("");
// Almost always not empty: argv[0]
if (argc > 0) // <--- is this necessary?
check_string(argv[0]);
}
Run Code Online (Sandbox Code Playgroud)
argc > 0如果我有一个在 Linux、macOS、Windows、Android 或任何其他常见操作系统上运行的程序,是否需要进行测试?据我所知,在这些环境下,第一个参数始终是程序本身的名称。
argc是否存在可以等于甚至小于0的环境?更准确地说,是argc在0独立环境中(即没有操作系统)吗?
据我所知,在这些环境下,第一个参数始终是程序本身的名称。
实际上,这通常只是一种约定,因为父进程可以自由决定它传递给新子进程的参数(如果有的话),例如通过家族exec*调用或类似的操作系统接口。
至少 v5.18 之前的 Linux 和 Windows(请参阅注释)对父级传递给子级的参数(如果有)没有限制,但操作系统也可能更严格。
特别是,由于argc == 0过去曾造成安全漏洞,Linux 自 v5.18 起强制在 if 中添加一个额外的空字符串(argv并设置argc为1)。请参阅提交和LWN 文章讨论此更改、以前依赖于允许的漏洞和程序。argc0argc == 0
C++ 标准确实规定,if argc >= 1 , thenargv[0]应该是一个空字符串或“用于调用程序的名称”。请参阅[basic.start.main]/2以供参考。但我认为这没有任何真正的规范意义,因为这样的名称没有定义。然而,它确实表明,如果给出任何论点,则应该遵循该约定。但它仍然允许argc == 0没有任何限制。
POSIX 更详细地说,在调用家庭呼叫之一时,“ argv[0] 中的值应该指向与正在启动的进程关联的文件名字符串”exec*。我认为“应该”并不意味着 POSIX 规范上下文中的严格要求,并且我没有看到任何“应该”声明需要至少一个参数。事实上,POSIX 包含一个基本原理(请参阅相同的链接),解释早期的 POSIX/C 标准提案包含这样的要求,但已被删除。“应该”要求仅适用于严格符合 POSIX 应用程序。
无论如何argc不能为负数。请参阅[basic.start.main]/2。