首页 > 解决方案 > 编译器是否会在嵌入式代码 C 中自动添加变量 argc 和 argv?

问题描述

我知道,当我在 UNIX o/s 上编写 C 程序时,如果我不声明它们,编译器会自动将变量添加到程序中argcargv但是,如果我编写一个 C 嵌入式程序——例如,ARM 微控制器的嵌入式程序,或 RTOS 中的 C 程序或 Window OS 中的 C 程序——编译器会自动在我的程序中添加argc和吗?argv

标签: clinuxunixenvironment-variablesembedded

解决方案


您最初的断言是不正确的。没有自动添加变量。操作系统将提供一个参数向量和计数,main()如果您声明它们,它们将通过参数传送到您的代码。这些论点不需要称为argc/ argv- 这只是一个约定。

在“独立”(即不由操作系统托管)程序中——这是大多数但不是所有嵌入式系统——C 运行时启动可能会将参数传递给main(),但在大多数情况下不会这样做。无论是否这样做,main()使用参数声明仍然有效并且必须编译,但内容可能未定义。

在某些情况下,您可能会main()从运行时启动传递参数,以便例如从引导加载程序传递信息。然而,这种行为通常由您通过自定义启动代码来编写和实现,除非您可能正在使用一些已经以这种方式运行的第三方嵌入式框架。

也就是说,main()如果它适合您,您可以在独立的嵌入式应用程序中使用参数,但您可能必须自己实现该行为。

通常在裸机系统中,开发人员可以访问源代码以进行启动,并且可以对其进行自定义,或者运行时提供存根/弱链接或类似内容进行自定义。运行时通常需要提供一个堆栈、初始化静态变量等等。通常会调用标准库 init 来建立诸如堆和标准 I/O 流之类的东西。main()如有必要,也可以在此处建立参数。

例如,参见此处描述的 armcc 编译器的启动。在第 4.4 节__rt_lib_init中依次调用__ARM_get_argv()(第 5.15 节)哪个进程_sys_command_string- 如果您提供_sys_command_string给链接器,main()将接收标准参数。


推荐阅读