c++ - "argv[0] = name-of-executable"是公认的标准还是只是一个常见的约定?

标签 c++ c standards argv

在 C 或 C++ 应用程序中将参数传递给 main() 时,argv[0] 是否始终是可执行文件的名称?或者这只是一个常见的约定,不能保证 100% 的时间是正确的?

最佳答案

猜测(甚至是有根据的猜测)很有趣,但您确实需要查看标准文档才能确定。例如,ISO C11 声明(我强调):

If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment.

所以不,它只是程序名称,如果该名称​​可用。“代表”程序名称,不一定程序名称。之前的部分指出:

If the value of argc is greater than zero, the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup.

这与之前的标准 C99 相比没有变化,这意味着即使 也不受标准规定 - 完全取决于实现。

这意味着如果宿主环境提供程序名称,则程序名称可以为空,如果宿主环境提供,则程序名称可以为空,前提是“其他任何东西”以某种方式代表程序名称。在我更加虐待狂的时候,我会考虑将它翻译成斯瓦希里语,通过替换密码运行它,然后以相反的字节顺序存储它:-)。

但是,实现定义确实在 ISO 标准中具有特定含义 - 实现必须记录其工作方式。因此,即使是 UNIX,它可以通过 exec 系列调用将任何它喜欢的东西放入 argv[0] 中,也必须(并且确实)记录它。

关于c++ - "argv[0] = name-of-executable"是公认的标准还是只是一个常见的约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050961/

相关文章:

c++ - 通过 PE header 找出 PE 文件的结束位置?

regex - 使用正则表达式查找没有 alt 属性的 img 标签

php - C++ 中的 PHP 示例

c++ - boost 正则表达式中的命名捕获/组列表

c++ - 帮助合并 vector 的算法

c - 为什么我会收到 lValue 错误?

c - 删除第一个数字时出现段错误

c - C 中是否存在依赖于两个不同分配的整数表示的用例?

c - 在 C 中将 float +INF、-INF 和 NAN 转换为整数的结果是什么?

c++ - 代码无法使用 Android NDK 编译