Windows 上C++命令行参数的问题
Issues with C++ command-line arguments on Windows
我不知何故在 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: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),
- 任何全局变量,以及
- 这些论点
argc
和argv
,正如您意外发现的那样。
因此,对于一个典型的程序,您可能希望它完成其工作。 在 Linux 世界中,还有一个名为 _start
的等效函数,它也需要执行相同的初始化任务,可以在链接时用 -e
覆盖。
这里的混淆可能源于"入口点"一词含义的歧义差异:从语言(main
及其同类)的角度来看,有"明显入口点"的含义,从语言实现的角度来看,"真正的入口点"的含义(…CRTStartup
或_start
)。
请注意,使用 …CRTStartup
函数并不是绝对必要的,因为您当然可以编写一个避免使用它们的程序。 但是,它确实需要付出代价:
- 你不能使用 C 运行时,所以你不能使用大多数标准库,
- 您需要手动初始化任何全局变量,并且
- 您需要使用 Windows API(
GetCommandLineW
和CommandLineToArgvW
)手动获取argc
和argv
。
有些这样做是为了避免依赖 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,并检查输出。
项目属性中检查字符集>常规是值得的。
- C++转换参数初始化问题
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 标准::enable_if 和标准::is_arithmetic 作为模板参数的问题
- enable_if中参数包的大小问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++复杂情况的比较器通过参数问题
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 模板<类型名称...参数>的问题
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- constexpr 运算符重载使用参数的问题
- 通过命令行参数获取llvm ir文件时面临问题
- 函数中使用的函数指针的参数的问题
- 我在生成返回为数不多的模板化参数之一cpp的函数时遇到问题
- 从命令行获取参数时出现问题
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- C++:关于for语句和参数的一般问题
- 字符串打印机问题:参数 X 没有从“char (*)[xx]”到“char**”的已知转换