MS C Runtime解析命令行填充argv前是否调用GetCommandLine()?
MSVC C运行时解析命令行参数的实现方式
MSVC的C运行时(CRT)确实是通过调用GetCommandLine()系列函数来获取原始命令行输入,再自行解析生成argc和argv参数的。
具体来说,CRT的启动代码(负责初始化程序并调用main/wmain的底层代码)会根据程序使用的字符集调用对应API:
- 针对ANSI字符集程序,调用
GetCommandLineA() - 针对Unicode字符集程序,调用
GetCommandLineW()
拿到完整的命令行字符串后,CRT会按照官方文档定义的规则(比如引号包裹的参数处理、空格分隔逻辑等)对字符串进行解析,拆分出各个命令行参数,最终填充到argc(参数数量)和argv(参数数组)中,再传递给main函数。
你提供的示例也能佐证这一点:执行w2 a^gb时,Shell先处理转义符^,将实际传递给程序的命令行字符串设为w2 agb,GetCommandLine()获取到的就是这个字符串,而CRT解析argc/argv时也是基于这个相同的原始字符串,二者的输入源完全一致。
内容的提问来源于stack exchange,提问作者barlop
相关产品推荐
相关产品推荐

