在POSIX中,一个main(void)函数能够恢复命令行参数吗?

7
在C语言中,定义main函数时是否真的需要使用int main(int argc, char *argv[])来接收程序参数呢?换句话说,当使用int main(void)的签名定义main函数时,是否可能仅使用POSIX接口恢复程序参数呢?
我感觉好像有些东西我没有理解到:
  • POSIX定义了多个接口用于检索其他进程特定信息。例如,有用于环境变量(可以说是从C99继承而来的,但还扩展了一些函数,如unsetenv())和主机标识(gethostid())的接口。
  • 特定操作系统定义了“全局”方式用于检索命令行参数。例如,Windows提供了GetCommandLineWCommandLineToArgvW函数,HP-UX提供了全局变量__argc_value__argv_value。Linux有/proc/self/cmdline,可以将其解析为argvargc

我会说这是实现定义的。 - Jabberwocky
考虑一个函数 int f(void)。如何从调用者中访问您传递给该函数的任何参数? - too honest for this site
1
关于Windows,请注意Windows使用完全实现定义的方式来定义主函数,这可能解释了需要通过单独的非标准API函数获取命令行参数的原因。 - Lundin
@Lundin:我想的是main函数完成所有这些操作(可能还涉及一些启动代码),然后调用Windows应用程序入口。不过,我必须承认,我已经很久没有看过Windows代码了。 - too honest for this site
1
@Olaf:很容易想象POSIX定义了一些全局变量,你可以在其中找到传递给main的相同的argcargv。显然,启动代码必须以实现相关的方式获取它们,因为它是平台ABI的一部分。在大多数(所有?)POSIX平台上,从被execve()执行的二进制文件中得到的第一条指令不是 main()的第一条指令。你所争论的观点,即没有其他POSIX标准的方法来查看命令行参数,似乎是正确的,但Rhymoid正确地指出它可能像环境变量一样。 - Peter Cordes
显示剩余5条评论
1个回答

4

POSIX规范不包括可以检索命令行参数的函数。所有指定的函数基本上都需要main()来协调传递argcargv进行解析。

POSIX规范(IEEE 1003.1,2013版 - 我撰写此文时的当前版本)有一个部分描述标准实用程序使用的命令行语法(这些实用程序在“Shell和实用程序”卷中描述)。然而,那些实用程序自然会使用POSIX函数,因此将使用调用它们的main(argc,argv)进行实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接