argc
(参数计数=参数数量)和argv
(数组或参数值列表,具体取决于语言)是操作系统作为参数提供给程序的。换句话说:“它是如何被调用的”。
正如cptPH的答案所明确说明的那样,这不仅适用于Qt
或Python
。在这里看一下:
https://en.wikipedia.org/wiki/Entry_point
对于C和C++:
https://en.wikipedia.org/wiki/Entry_point#C_and_C.2B.2B
对于Python:
https://en.wikipedia.org/wiki/Entry_point#Python
即使是 shell 脚本也有这些,称为“位置参数”:
http://www.tldp.org/LDP/abs/html/othertypesv.html
即使您的程序没有任何命令行选项,无论使用哪种语言或操作系统(除非是非常、非常奇特的),您始终需要至少:
- 一个
argc
为1,因为
argv
数组中的第0个元素将是程序被调用的名称
(这可能会有所变化,例如如果通过符号链接调用它,
或者仅仅是因为您更改了构建过程的目标二进制文件,
而您的程序“foo”现在是“bar” - 示例:在打印输出时不要使用硬编码的程序名称,而应使用 argv
数组中的第0个元素)。
迟早,您将编写使用选项/参数的程序。因此,您将使用这些选项/参数。例如:您可能希望添加“--verbose”或“--debug”选项,或者如果涉及文件处理,则添加“--input-file”。无论如何,您的程序都将在启动时解析这些 argv,并通过您明智的编码相应地更改其运行时行为。
例如:即使Python可以使用许多可选选项,并使用 argc
/argv
处理它们。从Python 3手册页中:
python [ -B ] [ -b ] [ -d ] [ -E ] [ -h ] [ -i ] [ -I ]
[ -m module-name ] [ -q ] [ -O ] [ -OO ] [ -s ] [ -S ] [ -u ]
[ -v ] [ -V ] [ -W argument ] [ -x ] [ [ -X option ] -? ]
[ -c command | script | - ] [ arguments ]
这些是Python解释器的所有可能
argv
。
编辑:
一个Qt应用程序的真实例子:
我参与开发了一个Qt网络应用程序。它可以在两种互斥模式下运行:
- “正常”模式,
- 或“间谍模式”:这是特殊的,因为它需要网络管理员权限进行一些低级操作。
所以我添加了一个CLI
-s/--spy-mode
选项。这是一个可选的
argv
。
在应用程序代码的开头,我检查这个
argv
-s/--spy-mode
CLI选项。
- 如果在“正常”模式下运行而没有使用此选项,与“间谍”模式相关的GUI元素甚至不会显示给用户,也不会实例化任何类。这是干净的,因为否则在许多对象实例化/方法中它将彻底失败,出现错误,并且由于低级调用将失败,然后我将以非零返回代码退出。那不好。如果可能失败,请尽早失败。
- 如果使用此
argv
选项启动“spy”模式,我在代码中要做的第一件事情就是检查调用用户是否确实拥有“网络管理员”权限,然后1 /如果他没有,则发出明确的错误消息/弹出窗口,解释“您应该具有blablabla特权,尝试sudo blablabla”,然后以非零返回代码退出,或2 /如果用户确实拥有所需的特权,则提供特殊的“spy mode”GUI元素并将其使用,没有问题(并隐藏大部分GUI“normal mode”元素,在此操作模式下无意义)。
这就是argc/argv
的作用。