C main 方法有签名
int main(int argc, char** argv) {
}
它将获得一个命令行参数数组。但是当尝试启动应用程序时,例如使用 CreateProcess或 ShellExecute ,它们只接受 2 个参数,一个用于启动应用程序,一个用于参数。 为什么参数也没有指定为数组?为什么每个使用其他应用程序的应用程序都必须处理命令行参数的转义,例如,在调用具有 2 个可能包含的任意文件名的比较工具时空格还是引号?
最佳答案
在极少数系统上,实际的程序执行实际上是从 main
(或 WinMain
)或类似函数开始的。取而代之的是,编译器告诉链接器使用一个特殊的函数,在 C 语言的意义上,该函数通常不会真正接受任何参数。
命令行参数(如果任何)可以通过汇编级别的特殊寄存器传递,或者需要使用特定于操作系统的特殊函数(如 Windows 中的 GetCommandLine
)来获取它们API)。
在 Windows 上,GetCommandLine
函数确实将命令行作为单个字符串获取。就像它被传递给例如创建进程
。
对于 Windows 控制台程序,特殊的“入口”函数会进行一些其他初始化(如设置 stdin
等),然后调用 GetCommandLine
获取命令行参数,然后将其解析为适合 main
函数的数组,然后调用该函数。
如果你看看 POSIX 世界(例如 Linux 和 macOS 所在的地方),那么它们有 the exec
family of functions这确实需要一个数组作为参数。或解析为此类数组的可变参数列表。
关于c - 主进程和启动进程之间的不对称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50015387/