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

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

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

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

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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

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

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

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

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

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

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


查看完整回答
反对 回复 2019-07-24
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

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

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


查看完整回答
反对 回复 2019-07-24
?
肥皂起泡泡

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

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

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

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


查看完整回答
反对 回复 2019-07-24
  • 3 回答
  • 0 关注
  • 795 浏览

添加回答

举报

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