“argv [0] =可执行程序名称”是可接受的标准还是公共约定?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (239)

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

提问于
用户回答回答于

猜测(甚至受过教育的猜测)很有趣,但你确实需要去标准文件。例如,ISO C11声明(我强调):

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

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

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

这与之前的标准C99没有什么不同,并且意味着即使这些不是由标准决定的 - 完全取决于实施。

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

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

用户回答回答于

*nix带有exec*()呼叫的类型系统下,argv[0]无论呼叫者在呼叫中放入哪个argv0位置exec*()

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

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

所属标签

可能回答问题的人

  • 天使的炫翼

    16 粉丝531 提问35 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券