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

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

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



猛跑小猪
浏览 798回答 3
3回答

泛舟湖上清波郎朗

猜测(即使是有教育意义的猜测)很有趣,但你确实需要去标准文件。例如,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%的时间。

肥皂起泡泡

根据C ++标准,第3.6.1节:argv [0]应该是指向NTMBS的初始字符的指针,该NTMBS表示用于调用程序的名称或“”所以不,至少在标准方面,它无法得到保证。
打开App,查看更多内容
随时随地看视频慕课网APP