当前位置: 首页 > 知识库问答 >
问题:

主函数c中argc和argv的值来自哪里

濮书
2023-03-14

我是c的新手,我见过许多c编译器自动将int argc、char*argv作为参数传递到main函数中,但它们在哪里定义?有点好奇。

共有3个答案

漆雕和昶
2023-03-14

我是c的新手,我见过很多c编译器自动在main函数中传递int argc,char* argv作为参数,但是它们是在哪里定义的呢?

它们是C和C标准的一部分。具体如何将它们提供给main()函数将取决于操作系统。例如,在Unix类系统中,使用fork()和某个版本的exec()的组合来创建一个新进程,然后在该新进程的上下文中加载和执行您的程序,并传递新程序的参数。其他操作系统会以其他方式启动新进程,但是argcargv参数仍然来自启动程序的程序,无论是面向命令的shell、一些GUI桌面管理器还是其他东西。

吕德惠
2023-03-14

请阅读一本好的C编程书,然后看看这个C参考和一些C标准,如n3337或更好。

您的编译器(如 GCC)不会将 argcargv 参数添加到主参数中。使用 gcc -Wall -Wextra -g,它正在检查具有这些参数(但您可以在 Linux 上定义 int main(void)int main(int argc,字符**engv, char**environ)。重要的是 main 的签名,而不是参数的确切名称(只是它们的类型和编号)。

您的操作系统(例如Linux及其内核)正在将这些传递给您的主操作系统。在 Linux 上,一个程序由 execve(2) 启动,并且该系统调用将参数传递给主节点。从技术上讲,调用堆栈的初始布局是在 ABI 中指定的。某些 crt0 初始化代码正在调用 main(和静态构造函数)。该初始化代码是用汇编程序编写的。阅读一本好的操作系统教科书。

有时,C用于独立模式。然后,没有main,其他约定也适用。一个典型的例子是用C语言编写操作系统内核(有关示例,请参阅OSDEV)

由于GCC、Linux内核和GNU libc都是自由软件,您可以下载它们的源代码并研究它(并在以后改进它)。请参见LinuxFromScratch。

研究 - 为了灵感 - 现有C开源项目的源代码,如Qt,FLTK,参考系统等。对于参考周刊,请通过电子邮件与我联系,basile@starynkevitch.net

赵英资
2023-03-14

这些通常由 shell 提供,或者更具体地说,由父进程提供。这是父进程可以决定要传递哪些参数(如果有)。这些出现在阿尔克/阿格夫中。请参阅 exec 函数系列,了解从父进程的角度来看其外观的示例。还有相同的内核版本用于启动进程。

它们是专门定义的,最终由操作系统及其进程间机制提供。这是定义 main() 函数的 C 标准的一部分。

这种机制是从C版本继承而来的,这在很大程度上是UNIX本身设计的副产品,因为C和UNIX是同时产生的。

 类似资料:
  • 本文向大家介绍对python中的argv和argc使用详解,包括了对python中的argv和argc使用详解的使用技巧和注意事项,需要的朋友参考一下 主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argument vector,命令行参数向量(内容) 通

  • 本文向大家介绍awk ARGV,ARGC-命令行参数数组,包括了awk ARGV,ARGC-命令行参数数组的使用技巧和注意事项,需要的朋友参考一下 示例 传递给awk的命令行参数存储在内部元素数组ARGV中ARGC。数组的第一个元素是程序名称。例如: 产生:            

  • 我从来没有用过, int main(int argc,const char*argv[] 对于大多数程序,我通常只使用两个单独的C文件在终端(使用mac)中编译,例如… gcc功能. c main. c 但是现在我需要使用int main(int Argc,const char*Argv[])...我只是不知道我是否正确使用它。这里有一些代码... 我在命令行中编译做… 海湾合作委员会主要。c输入

  • 我试图用C语言重新编写一些MatLab代码,我遇到了以下问题: 我在互联网上找到了以下链接:http://www.mathworks.co.uk/help/techdoc/ref/sign.html 我只是想知道C中是否有符号函数?如果没有,谁能推荐一些关于创建它的教程吗。 谢谢:)

  • 页面getSearchedTable(String query,@param(“date”)LocalDate businessDate,Pageable Pageable);

  • 我正在处理一个使用MPAndroidChart库的项目,这让我非常疯狂,我想删除它。 问题是,我创建了一个自定义的ValueFormatter,我无法理解这些值来自何处,它们都是错误的。 自定义格式化程序类:我有一个数组,它有1,2,3,4,5,6,7,8,9,10个值,但我在getFormattedValue方法中得到了2,4,6,8,10个。 }