Windows上的C ++命令行参数问题

时间:2014-12-26 07:46:43

标签: c++ windows command-line-arguments msvc12

我在某种程度上遇到了在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;
}

变量argcargv似乎在某种程度上未初始化。 这就是推出该计划的原因:

Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
  argv[0]
  argv[1]   ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
  argv[2]

(崩溃跟随)

我使用/SUBSYSTEM:CONSOLE链接器选项使用MSVC12编译它。 可能是造成这个问题的原因是什么?

4 个答案:

答案 0 :(得分:6)

  

我手动将入口点设置为main。无论我是否使用默认项目设置(_tmain),问题仍然存在。

一般情况下,除非您知道后果,否则不应该这样做。 entry point (/ENTRY)的典型值应为:

  • [w]mainCRTStartup,调用[w]main
  • [w]WinMainCRTStartup,调用[w]WinMain
  • _DllMainCRTStartup,调用DllMain

为什么需要这个?好吧,…CRTStartup - 函数族do a couple crucial things,包括初始化:

  • C运行时(CRT),
  • 任何全局变量,
  • 参数argcargv,正如您不小心发现的那样。

因此,对于典型的程序,您可能希望它能够完成其工作。在Linux世界中,还有一个名为_start的等效函数,它也需要执行相同的初始化任务,在链接时可以用-e覆盖。

这里的困惑可能源于“入口点”这个词含糊不清的含义:从语言的角度来看,“明显的切入点”的含义(main及其之类),以及从语言实现的角度来看“真正的切入点”的含义(…CRTStartup_start)。

请注意,使用…CRTStartup函数并非绝对必要,因为您当然可以编写一个避免使用它们的程序。但确实需要付出代价:

  • 您不能使用C运行时,因此您无法使用大多数标准库
  • 您需要手动初始化任何全局变量,
  • 您需要使用Windows API(argcargv)手动获取GetCommandLineWCommandLineToArgvW

有些人这样做是为了避免对CRT的依赖,或者最小化可执行文件的大小。

答案 1 :(得分:1)

我在VS 2012上尝试了你的项目,它运作顺畅。 我添加了一个getchar();命令如下:

#include <iostream>

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";
    getchar();
    return 0;
}

这样我就能看到输出。

  

右键单击Project - &gt;属性 - &gt;调试 - &gt;命令   参数。

这在我的项目中是空的,我添加了角色a来模拟你的问题。

以下是我得到的输出:

  

右键点击该项目 - &gt;调试 - &gt;启动新实例 - &gt;你会   喜欢建立它 - &gt;是

输出:

Command-line argument count: 2
Arguments:
  argv[0]   <my macines path>\helpingStack1.exe
  argv[1]   a

请再次检查。我希望这会有所帮助。

1)我怀疑你运行这个脚本时你的二进制文件是不是最新的,所以请做一个干净的构建并验证你确实运行的是与你正在构建的exe相同的exe。请检查配置 - 调试/发布。

2)转到您已创建项目的文件夹并在项目文件夹上单击并更改属性 - &gt;确保在复选框中未选中只读。

答案 2 :(得分:0)

显然,IDE或项目出现问题,或者只能在系统上进行其他任何设置。 代码很完美。

您是否尝试通过命令提示符

直接并独立地运行输出exe

通过提供一些任意参数来运行你的exe命令提示符,并检查输出。

答案 3 :(得分:-1)

值得检查项目属性中的字符集 - &gt; General。