我已经读过argv
的第一个数组成员将始终是程序名。
坚持下去是否有用?我正在学习,请原谅我,如果这是一个愚蠢的问题。
人们是否曾将第一个成员卸下,因为它没用(并将argv
重置为少一个?),或者将其留在那里是最佳实践,因为人们期望它永远存在(并且它可以工作)开箱即用argc
)?
答案 0 :(得分:7)
我已经读过argv的第一个数组成员将始终是程序名。
它应该。 C和C ++都要求如果argc
大于零,argv[0]
应该是程序名或空字符串。
某些系统在所有情况下都不一定遵循此约定(例如,在Windows上,您可以使用CreateProcess
创建新进程,而不是在用于填充的命令行参数中传递程序名称argc
和argv
)。
坚持下去是否有用?
不确定。例如,如果您想生成自己的另一个实例,或者想要打印您的程序名称(例如在使用说明中)。
人们有没有取消第一个成员的速度,因为它没用,或者留下最佳实践?
不要改变实际的论点;下一个出现的人可能会期望他们处于原始状态。
答案 1 :(得分:4)
准确地说,argv[0]
是传递给exec(2)的任何东西,它通常是程序名称,但可以是任何东西。
不要取消它,因为有太多隐藏的依赖项依赖它。
答案 2 :(得分:3)
预计argv [0]将始终包含可执行文件的名称。因此,你永远不应该删除它。
至于它是否有用,argv [0]的一个用途是,如果你希望你的应用程序根据它的调用方式改变行为。
例如,Busybox在嵌入式Linux系统上使用它。通常,您将拥有可执行文件的单个副本,并创建具有不同名称的可执行文件的符号链接。例如。 cp,rm,ls等 Busybox然后根据argv [0]的内容确定要执行的功能。
答案 3 :(得分:3)
第一个参数并不总是程序名称 - 它取决于它的调用方式(参见here)。
通常,argv[0]
用于帮助文字:
fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]);
移动阵列并不是非常有用或有效。您也可以从索引1开始使用argv。
答案 4 :(得分:0)
argv [0]的内容不是由ANSI定义的。 argv可枚举:
main(int argc,char**argv)
{
while( argc-- )
puts(*argv++);
return 0;
}
答案 5 :(得分:0)
来自ISO C99,§5.1.2.2.1,
如果argc的值大于零,则argv [0]指向的字符串表示程序名称;如果程序名不能从主机环境获得,则argv [0] [0]应为空字符。
因此,在符合要求的实现中,您可以依赖argv[0]
作为程序的名称,如果您之前测试它的存在(也就是说,如果您可以断言{{1} })。