我想更好地理解在启动C或C++程序时,命令行参数背后到底发生了什么。当然,我知道argc和argv在传递给main()时,分别表示参数计数和参数向量。我想弄清楚的是编译器是如何将int argc解释为从命令行传递的参数的数量的。(例如int testfunc(int argc, char* argv[])),并传入一个字符串,编译器就会抱怨,“预期为'int',但参数类型为char*”。当命令行参数传递给main()时,这有何不同的解释?
argc
argv
main()
int argc
int testfunc(int argc, char* argv[])
pgvzfuti1#
在常见的C实现中,main不是进程启动时调用的第一个例程。通常,它是由程序中内置的C库在链接时提供的某个特殊入口点(如_start)。此特殊入口点处的代码检查传递给它的命令行信息(以某种方式在C之外,特别是在操作系统中),并为main构造一个参数列表。
main
_start
vmjh9lq92#
您不必自己传递argc值(例如,从命令行),它是由您的环境(运行时)提供的,就像argc的 * 确切 * 内容一样。详细说明,C11,第§5.1.2.2.1章,(* 矿山指标 *)
C11
argv[argc]
argv[0]
argv[argc-1]
2条答案
按热度按时间pgvzfuti1#
在常见的C实现中,
main
不是进程启动时调用的第一个例程。通常,它是由程序中内置的C库在链接时提供的某个特殊入口点(如_start
)。此特殊入口点处的代码检查传递给它的命令行信息(以某种方式在C之外,特别是在操作系统中),并为main
构造一个参数列表。vmjh9lq92#
您不必自己传递
argc
值(例如,从命令行),它是由您的环境(运行时)提供的,就像argc
的 * 确切 * 内容一样。详细说明,
C11
,第§5.1.2.2.1章,(* 矿山指标 *)argc
的值应为非负数。argv[argc]
应为空指针。argc
的值大于零,则数组成员argv[0]
到argv[argc-1]
(包括argv[0]
和argv[argc-1]
)应包含指向字符串的指针,在程序启动之前由宿主环境给定实现定义的值。其目的是在宿主环境中的其他地方向程序提供在程序启动之前确定的信息。如果主机环境无法提供同时具有大小写字母的字串,实作应确保以小写接收字串。[注意结尾]