【发布时间】:2015-02-23 14:24:15
【问题描述】:
我在使用 C++ 解析 Windows 上的命令行参数时遇到了问题。 我试过用这个
int main(int argc, char **argv)
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "
<< argv[i] << "\n";
return 0;
}
还有这个
int main(int argc, char *argv[])
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "
<< argv[i] << "\n";
return 0;
}
变量argc 和argv 似乎以某种方式未初始化。
这就是启动程序返回给我的结果:
Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
argv[0]
argv[1] ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
argv[2]
(崩溃跟随)
我使用 MSVC12 使用 /SUBSYSTEM:CONSOLE 链接器选项编译它。
这个问题的原因可能是什么?
【问题讨论】:
-
你总是得到完全相同的垃圾数据吗?你能检查
_mainCRTStartup是否设置为入口点吗?您使用的是什么版本的 CRT? -
代码没有问题。检查您的项目设置。
-
@codefox 等一下,你是说手动将入口点设置为
main?这行不通,入口点必须是 CRT 入口点mainCRTStartup,正如上面提到的 Rufflewind(好吧,据我所知,它是在链接器选项中指定的,没有前导下划线)。详情请看this question。 -
@codefox 这适用于所有应用程序。需要一些代码来解析操作系统给出的命令行并构建
main的标准声明所需的参数。更不用说在调用main之前需要发生的所有其他事情。 -
@codefox
/SUBSYSTEM:CONSOLE和/SUBSYSTEM:WINDOWS之间的一个区别是,当指定前者时,默认入口点是mainCRTStartup,所以你不需要明确地将其提供给链接器。
标签: c++ windows command-line-arguments msvc12