c - 编译器是否会在嵌入式代码 C 中自动添加变量 argc 和 argv?
问题描述
我知道,当我在 UNIX o/s 上编写 C 程序时,如果我不声明它们,编译器会自动将变量添加到程序中argc
。argv
但是,如果我编写一个 C 嵌入式程序——例如,ARM 微控制器的嵌入式程序,或 RTOS 中的 C 程序或 Window OS 中的 C 程序——编译器会自动在我的程序中添加argc
和吗?argv
解决方案
您最初的断言是不正确的。没有自动添加变量。操作系统将提供一个参数向量和计数,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()
将接收标准参数。
推荐阅读
- macos - 带有 AudioFileID 和加密文件的音频单元文件阅读器
- reactjs - realm.objects(databaseName) 总是返回数组类型的结果,但我正在寻找返回对象而不是数组的东西
- r - R:识别异常值并在箱线图中标记它们
- gremlin - Gremlin,按边属性分组
- html - 从另一个页面更改 iframe
- azure - 是否可以(通过不同的支持)将 Azure 驱动器附加到 Azure 应用服务实例?
- c++ - 这两个条件有何不同?
- javascript - Javascript:如何将“选定”分配给“选项”元素
- javascript - javascript错误说array.some不是一个函数
- c++ - 如何在两个整数之间找到斐波那契数?