在 C 或 C++ 应用程序中将参数传递给 main()
时,argv[0]
是否始终是可执行文件的名称?或者这只是一个常见的约定,不能保证 100% 的时间是正确的?
最佳答案
猜测(甚至是有根据的猜测)很有趣,但您确实需要查看标准文档才能确定。例如,ISO C11 声明(我强调):
If the value of
argc
is greater than zero, the string pointed to byargv[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 membersargv[0]
throughargv[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/