C main方法具有签名
int main(int argc, char** argv) {
}
它将获得一系列命令行参数。但是在尝试启动应用程序时,例如使用CreateProcess或ShellExecute,它们只接受2个参数,一个用于启动应用程序,另一个用于参数。 为什么参数也没有指定为数组?为什么每个使用其他应用程序的应用程序都必须处理命令行参数的转义,例如,在调用具有2个可能包含的任意文件名的比较工具时空格或引号?
答案 0 :(得分:4)
在极少数系统上,实际程序执行实际上是从main
(或WinMain
)或类似功能开始的。相反,编译器告诉链接器使用一个特殊的函数,它通常不会真正使用任何参数,在C语义中。
命令行参数(如果 any )可以通过程序集级别的特殊寄存器传递,或者需要使用特定的OS特定函数(如GetCommandLine
)获取它们。 Windows API)。
在Windows上,GetCommandLine
函数确实将命令行作为单个字符串。就像传递到例如CreateProcess
。
对于Windows控制台程序,特殊的“entry”函数执行其他一些初始化(如设置stdin
等),然后调用GetCommandLine
来获取命令行参数,然后解析成适合main
函数的数组,然后调用它。
如果你看一下POSIX世界(例如Linux和macOS所在的地方),那么他们就拥有了the exec
family of functions,它确实为参数提供了一个数组。或者是一个变量参数列表,它被解析成这样一个数组。