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

Issues with C++ command-line arguments on Windows

本文关键字:问题 参数 命令行 C++ Windows      更新时间:2023-10-16

我不知何故在 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:DevProcessSuspenderDebug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
  argv[0]
  argv[1]   ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
  argv[2]

(崩溃跟随)

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

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

一般来说,除非您知道后果,否则您不应该这样做。 入口点(/ENTRY)的典型值应为:

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

为什么需要这样做? 好吧,…CRTStartup 函数系列做了几件关键的事情,包括初始化:

  • C 运行时 (CRT),
  • 任何全局变量,以及
  • 这些论点argcargv,正如您意外发现的那样。

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

这里的混淆可能源于"入口点"一词含义的歧义差异:从语言(main及其同类)的角度来看,有"明显入口点"的含义,从语言实现的角度来看,"真正的入口点"的含义(…CRTStartup_start)。

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

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

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

我在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;
}

这样我就可以看到输出。

右键单击项目 -> 属性 ->

调试 -> 命令 参数。

这在我的项目中是空的,我添加了字符 a 来模拟您的问题。

这是我得到的输出:

右键单击项目 -> 调试 ->

启动新实例 -你会> 喜欢建造它 ->是的

输出:

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

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

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

2) 转到创建项目的文件夹,单击项目文件夹,然后更改属性 ->确保未选中复选框中的只读。

显然,IDE或项目有问题,或者仅在系统上设置其他任何内容。代码是完美的。

您是否尝试过通过命令提示符执行直接且独立地运行输出 exe?

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

项目属性中检查字符集>常规是值得的。