C+的问题+;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; }
(追尾) 我使用MSVC12使用C+的问题+;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; },c++,windows,command-line-arguments,msvc12,C++,Windows,Command Line Arguments,Msvc12,(追尾) 我使用MSVC12使用/SUBSYSTEM:CONSOLE链接器选项编译了它。 这个问题的原因是什么?我在VS 2012上试过你的项目,它运行得很顺利。 我添加了一个getchar();命令如下: #include <iostream> int main(int argc, char *argv[]) { std::cout << "Command-line argument count: " << argc << " \n";
/SUBSYSTEM:CONSOLE
链接器选项编译了它。
这个问题的原因是什么?我在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;
}
#包括
int main(int argc,char*argv[])
{
std::cout在projectproperties->General中检查角色集是值得的。显然,IDE或项目或系统上的其他设置有问题。
代码是完美的
您是否尝试过通过命令提示符直接独立地运行输出exe
通过提供一些任意参数,在命令提示符下运行exe,并检查输出
我已手动将入口点设置为main
。无论我是否使用默认项目设置(\u tmain
),问题仍然存在
通常,除非您知道后果,否则不应这样做。的典型值应为:
[w]mainCRTStartup
,调用[w]main
,或
[w]WinMainCRTStartup
,调用[w]WinMain
,或
\u DllMainCRTStartup
,它调用DllMain
为什么需要这样做?嗯,…CRTStartup
-函数系列,包括以下函数的初始化:
- C运行时(CRT)
- 任何全局变量,以及
- 参数
argc
和argv
,正如您意外发现的那样
因此,对于一个典型的程序,您可能希望它完成它的工作。在Linux世界中,有一个名为\u start
的等效函数,它也需要执行相同的初始化任务,链接时可以用-e
覆盖该函数
这里的混淆可能源于“入口点”一词的歧义含义的不同:从语言(即main
及其同类)的角度来看,存在“明显入口点”的含义,从语言实现的角度来看,存在“真正入口点”的含义(即…CRTStartup
或\u start
)
请注意,使用…CRTStartup
函数并不是绝对必要的,因为您当然可以编写一个避免使用它们的程序。但是,这会带来成本:
- 不能使用C运行时,因此不能使用大多数标准库
- 您需要手动初始化任何全局变量,并且
- 您需要使用Windows API手动获取
argc
和argv
(GetCommandLineW
和CommandLineToArgvW
)
有些人这样做是为了避免对CRT的依赖,或者最小化可执行文件的大小。我创建了一个新项目,以检查它是否是由某些项目设置引起的,但我仍然无法使其工作。在VS 2013中也可以正常工作。检查是否有其他干扰,如病毒扫描程序。我没有运行任何类似病毒扫描程序的程序在我的开发机器上运行。不应该有任何干扰。无论我将其设置为Unicode还是多字节,在这两种情况下,问题仍然存在。你总是得到完全相同的垃圾数据吗?你能检查一下是否将\u mainCRTStartup
设置为入口点吗?你使用的是什么版本的CRT?没有g代码错误。请检查项目设置。@codefox等一下,您是说您手动将入口点设置为main
?这不起作用,入口点必须是CRT入口点mainCRTStartup
,如上所述(好吧,除非在链接器选项中指定了它,但据我所知没有前导下划线)。查看详细信息。@codefox这适用于所有应用程序。需要一些代码来解析操作系统给出的命令行,并生成标准声明main
所需的参数。更不用说调用main
之前需要发生的所有其他事情。@codefoxode>/SUBSYSTEM:CONSOLE
和/SUBSYSTEM:WINDOWS
是指当指定前者时,默认入口点为mainCRTStartup
,因此不需要显式地将其提供给链接器。我尝试了这两种方法,从IDE和命令提示符运行。结果是相同的。尽管其他的一切都运行正常…很奇怪…我想知道问题可能是什么…但是,作为一个瞎猜,我建议尝试另一个编译器,例如MinGW…Gud luckThanks,以获得详细的解释!将来,我一定会记住这一点。这个问题真的让我发疯,但现在一切都正常。除非坏了!
Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
argv[0]
argv[1] ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
argv[2]
#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;
}
Command-line argument count: 2
Arguments:
argv[0] <my macines path>\helpingStack1.exe
argv[1] a