代码之家  ›  专栏  ›  技术社区  ›  Thomas S.

主程序和启动程序之间的不对称性

  •  0
  • Thomas S.  · 技术社区  · 7 年前

    C main方法具有签名

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

    它将获得一组命令行参数。但在尝试启动应用程序时,例如使用 CreateProcess ShellExecute ,它们只接受2个参数,一个用于启动应用程序,另一个用于参数。 为什么参数也没有指定为数组? 为什么每个使用其他应用程序的应用程序都必须处理命令行参数的转义,例如,当使用可能包含空格或引号的2个任意文件名调用比较工具时?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Some programmer dude    7 年前

    在极少数系统上,实际的程序执行实际上从 main (或 WinMain )或类似功能。相反,编译器告诉链接器使用一个特殊的函数,该函数通常不会 任何 参数,在单词的C意义上。

    命令行参数(如果 任何 )可以通过程序集级别的特殊寄存器传递,或者需要使用特定于操作系统的特殊函数(如 GetCommandLine 在Windows API中)。

    在Windows上 GetCommandLine 函数确实以单个字符串的形式获取命令行。就像它被传给了,例如。 CreateProcess

    对于Windows控制台程序,特殊的“entry”函数会执行一些其他初始化(如设置 stdin 等),然后打电话 GetCommandLine 获取命令行参数,然后将其解析为适合 主要的 函数,然后调用该函数。


    如果你看看POSIX世界(例如Linux和macOS所在的地方),那么他们有 the exec family of functions 这确实需要一个数组作为参数。或者一个被解析为这样一个数组的变量参数列表。