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