c - 主进程和启动进程之间的不对称

标签 c winapi program-entry-point

C main 方法有签名

int main(int argc, char** argv) {
}

它将获得一个命令行参数数组。但是当尝试启动应用程序时,例如使用 CreateProcessShellExecute ,它们只接受 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/

相关文章:

java - 线程 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -1 中的错误异常

haskell - Prelude(Haskell)加载模块后如何退出 "Main"状态?

c - Xcode 在程序中给出了 3 个处理 Stray '\342' 的语法错误

c - 可变参数函数 - 如何获取 var_args 的数量?

c++ - 在屏幕上定位程序位置

c - 对 CreateProcessWithLogonW 的 undefined reference

java - 我们可以在一个接口(interface)中有一个 main() 并在实现这个接口(interface)的类中有不同的 main() 实现吗?

c - 初始化未知大小的二维数组

c++ - Windows API 图形用户界面设计器?

windows - 我应该使用什么 Windows API 函数将文件/文件夹标记/取消标记为 protected 操作系统文件?