gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:47:40 24 4
gpt4 key购买 nike

我在使用 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 编译了它。这个问题的原因可能是什么?

最佳答案

I've manually set the entry point to main. Whether I use the default project setting (_tmain) or not, the issue persists.

一般来说,除非您知道后果,否则您不应该这样做。 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 运行时,所以你不能使用大多数标准库,
  • 您需要手动初始化任何全局变量,并且
  • 需要手动获取argcargv使用 Windows API(GetCommandLineWCommandLineToArgvW)。

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

关于c++ - Windows 上 C++ 命令行参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27654323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com