尝试从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
*/
答案 0 :(得分:0)
您应该在上游提交错误。
不确定,导致这种情况的原因是什么,也缺乏环境。
我认为这是由于mingwrt或mingw-w64运行时的不同版本声明/定义__argv
/ _argv
的方式。您可能想要检查相应的包含和/或预处理的源。
如果您不介意使用某些Windows API,如果需要,您仍然可以使用来自widechar的CommandLineToArgvW(GetCommandLineW(), ...)
和convert来自己缩小字符。
答案 1 :(得分:0)
首先,删除所有内容并重新安装后,我发现一切正常并按预期工作。所以问题就是并排坐在一起时对Dev-C ++和C :: B设置的过度自信......
其次,我感谢有效的回复,但是...使用Win API CommandLineToArgvW(...)
只是重做启动代码已经执行的内容。
最后,仅供参考,我实际上在Borland Builder,Open Watcom和GCC中找到(并使用过)__argv
和__argc
。不知道这是否是标准要求,或仅仅是事实上的&#34;标准(从MS库继承)。