为了账号安全,请及时绑定邮箱和手机立即绑定

“argv [0] =可执行文件名称”是一个公认的标准还是只是一个共同的约定?

“argv [0] =可执行文件名称”是一个公认的标准还是只是一个共同的约定?

C++
湖上湖 2019-09-06 12:06:55
“argv [0] =可执行文件名称”是一个公认的标准还是只是一个共同的约定?main()在C或C ++应用程序中传递参数时,将argv[0]始终是可执行文件的名称?或者这只是一个常见的约定,并不保证100%的时间都是真的?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

猜测(即使是有教育意义的猜测)很有趣,但你确实需要去标准文件。例如,ISO C11陈述(我的重点):

如果值argc大于零,则指向的字符串argv[0] 表示程序名称; argv[0][0]如果程序名不能从主机环境获得,则应为空字符。

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

如果值argc大于零,则argv[0]通过argv[argc-1]包含的数组成员应包含指向字符串的指针,这些指针在程序启动之前由主机环境给出实现定义的值。

这与之前的标准C99相同,并且意味着即使这些也不是由标准决定的 - 它完全取决于实现。

这意味着,节目名称可以是空的,如果主机环境如果主机环境提供它,别的提供的,规定“任何东西”在某种程度上代表了程序名称。在我更悲惨的时刻,我会考虑将其翻译成斯瓦希里语,通过替换密码运行它,然后以反向字节顺序存储它:-)。

但是,实现定义确实在ISO标准具有特定含义 - 实现必须记录其工作原理。因此,即使UNIX,它可以把任何东西它喜欢到argv[0]exec家人通话的,有(并执行)文件就可以了。



查看完整回答
反对 回复 2019-09-10
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

*nix具有exec*()呼叫的类型系统下,argv[0]将是呼叫者在呼叫中放入的任何argv0地方exec*()

shell使用这是程序名称的约定,并且大多数其他程序遵循相同的约定,因此argv[0]通常是程序名称。

但是一个流氓Unix程序可以调用exec()并制作argv[0]任何它喜欢的东西,所以无论C标准说什么,你都不能指望这个100%的时间。



查看完整回答
反对 回复 2019-09-10
?
烙印99

TA贡献1829条经验 获得超13个赞

根据C ++标准,第3.6.1节:

argv [0]应该是指向NTMBS的初始字符的指针,该NTMBS表示用于调用程序的名称或“”

所以不,至少在标准方面,它无法得到保证。


查看完整回答
反对 回复 2019-09-10
  • 3 回答
  • 0 关注
  • 391 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信