当试图从CPP文件访问命令行参数时,我遇到了麻烦。多年来,使用__argv工作得很好,但现在,当我使用Dev-CPP (版本.5.5.3)和Code::Blocks (svn build rev 9248已打补丁,可与FORTRAN一起使用)。下面我粘贴了一个3条语句的示例,并在困扰我的行上进行了注释,而在最后一个大括号下面,我添加了编译和链接命令。是什么阻止了我继续使用__argv?
#include <stdlib.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char cmd[1024];
// line below work OK with Dev-CPP and TDM-GCC 4.7.1
// (and all previous versions I've used ...) but got a
// "Program received signal SIGSEGV, Segmentation fault"
// when using C::B and GCC 4.8.1-4
strcpy(cmd, __argv[0]);
// line below work fine with C::B and GCC 4.8.1-4 but
// won't compile with Dev-CPP and TDM-GCC 4.7.1
// strcpy(cmd, _argv[0]);
MessageBoxA(NULL, cmd, "argv[0]", MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
return 0;
}
/*
C::B compiler commands :
mingw32-g++.exe -march=i586 -Wextra -Wall -g -fpermissive -Wno-write-strings -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0500 -DWINVER=0x0500 -g -march=i586 -Wextra -Wall -c C:\Dev\Src\C_B\trivialtests\wtest1\wtest1_main.cpp -o obj\Debug\wtest1_main.o
mingw32-g++.exe -o bin\Debug\wtest1.exe obj\Debug\wtest1_main.o -static -lgdi32 -luser32 -lkernel32 -lcomctl32
Dev-C++ compiler commands :
g++.exe -c wtest1_main.cpp -o wtest1_main.o -I"C:/Dev/Dev-Cpp/MinGW64/include" -I"C:/Dev/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Dev/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.7.1/include/c++" -march=pentium -m32 -Wall -Wextra -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0500 -DWINVER=0x0500 -fpermissive -Wno-write-strings
g++.exe wtest1_main.o -o wtest1.exe -L"C:/Dev/Dev-Cpp/MinGW64/lib32" -L"C:/Dev/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32" -static-libgcc -mwindows -m32
full GDB message :
Program received signal SIGSEGV, Segmentation fault.
At C:\Dev\Src\C_B\trivialtests\wtest1\wtest1_main.cpp:10
> backtrace
#0 0x004016c0 in WinMain@16 (hInstance=0x400000, hPrevInstance=hPrevInstance@entry=0x0, lpCmdLine=lpCmdLine@entry=0x583282 "", nCmdShow=nCmdShow@entry=10) at C:\Dev\Src\C_B\trivialtests\wtest1\wtest1_main.cpp:10
#1 0x0041117b in main (argc=1, argv=0x3e17f0, __p__environ=0x3e1c10) at ../mingwrt-4.0.3-1-mingw32-src/src/libcrt/crt/main.c:91
*/发布于 2013-12-05 20:27:44
你可能应该向上游提交一个bug。
不确定是什么导致了这一点的不同,也缺乏环境。我假设这是由于不同版本的mingwrt或mingw-w64运行时声明/定义__argv/_argv的方式所致。您可能希望检查相应的包含和/或预处理来源。
如果您不介意使用一些Windows API,如果需要的话,您仍然可以使用widechar中的CommandLineToArgvW(GetCommandLineW(), ...)和convert来缩小字符范围。
发布于 2013-12-10 01:14:13
首先,在删除所有内容并重新安装后,我发现一切正常,并按预期工作。所以问题很简单,当并排坐在一起时,对Dev-C++和C::B设置过于自信……其次,我很感谢你的回复,但是...使用Win CommandLineToArgvW(...)只是在重做启动代码已经在执行的事情。最后,仅供参考,我实际上在Borland Builder、Open Watcom和GCC中找到(并使用)了__argv和__argc。不知道这是标准所要求的,还是仅仅是“事实”标准(继承自MS库)。
https://stackoverflow.com/questions/20398766
复制相似问题