我有一个 Visual Studio C++ 项目。如果我只想运行一次,我可以简单地手动输入参数
int main(int argc, char** argv)
进入debugging options
,然后单击Debug。
但是现在,我希望一次使用不同的参数运行多次。例如,我希望像这样运行它:
for(i=0; i<10; i++)
{
main(i);
}
如何使用 Visual Studio 执行此操作?
我有一个 Visual Studio C++ 项目。如果我只想运行一次,我可以简单地手动输入参数
int main(int argc, char** argv)
进入debugging options
,然后单击Debug。
但是现在,我希望一次使用不同的参数运行多次。例如,我希望像这样运行它:
for(i=0; i<10; i++)
{
main(i);
}
如何使用 Visual Studio 执行此操作?
在 C++ 中,在程序中调用是非法main
的(C++11 §3.6.1/3)。但是,在内部完成的任何工作都main
可以在另一个函数中轻松完成。
int main( int argc, char** argv ) {
foo( argc, argv );
}
int foo( int argc, char** argv ) {
// do something
}
此时,您可以随意foo(...)
在您的程序(或 Visual Studio 调试器)中任意调用多次。
我不相信调用main
. 即使是这样,您也会传递错误的参数(argc == 1
和argv == ${DEITY}_ONLY_KNOWS
)。
这是一个我可能会用 cmd 脚本解决的问题。只需确保您的程序已编译,然后运行类似:
@echo off
cd \path\to\debug\dir
rem this bit can be as complex as cmd.exe allows:
for /l %%a in (0,1,50) do (
for /l %%b in (0,1,10) do (
echo data.txt result.txt %%a %%b
)
)
这将运行一个命令(echo
在我的例子中,你可以看到它工作,但你应该用你的实际可执行文件名称替换它,并修改 cd 命令以选择正确的目录)561 次(51 x 11),前两个参数固定最后两个运行 0-50 和 0-10,其输出完成:
: : : : : : : : : :
data.txt result.txt 49 7
data.txt result.txt 49 8
data.txt result.txt 49 9
data.txt result.txt 49 10
data.txt result.txt 50 0
data.txt result.txt 50 1
data.txt result.txt 50 2
data.txt result.txt 50 3
data.txt result.txt 50 4
data.txt result.txt 50 5
data.txt result.txt 50 6
data.txt result.txt 50 7
data.txt result.txt 50 8
data.txt result.txt 50 9
data.txt result.txt 50 10
可能有一种方法可以让 VS 作为构建/运行序列的一部分自动执行此操作,但我不知道有任何方法(而且我大多数时候倾向于选择最简单的解决方案)。
当然,您可以重构代码,以便重命名为其他名称,然后使用如下main
过滤器:main
int main (int argc, char *argv[]) {
// Do this normally:
return worker (argc, argv);
// Or do this for debugging:
// int stat = 0;
// for (int i = 0; i < 10; i++) {
// // construct argv-lookalike based on i.
// stat = worker (myargc, myargv);
// if (stat != 0) break;
// }
// return stat;
但是,argv 数组的构造并非易事,因为您必须遵循标准中规定的相同规则,特别是argc
并且argv
必须同意,argv
必须是字符指针数组(比 表示的多一个argc
),以便每个参数是 C 风格的字符串,argv[0]
必须表示程序名称,argv[argc]
必须为 NULL,等等。
使用cmd
脚本解决方案可能是最简单的,让启动代码为您处理所有参数准备工作。
假设您有这个假设的程序:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char* argv[])
{
if(argc != 2)
{
cerr << "bad input" << endl;
exit(1);
}
auto arg = atoi(argv[1]);
cout << (2*arg) << endl;
}
您可以使用批处理脚本。将以下内容保存test.bat
在与您的程序可执行文件相同的目录中。键入help
或专门help for
在命令提示符中输入有关批处理文件命令的更多信息:
@echo off
for /L %%i in (0,1,9) do prog.exe %%i
输出:
0
2
4
6
8
10
12
14
16
18
或者您可以将 main 重构为循环并调用函数:
#include <iostream>
using namespace std;
void func(int arg)
{
cout << (2*arg) << endl;
}
int main()
{
for(auto i = 0; i < 10; ++i)
func(i);
}
输出:
0
2
4
6
8
10
12
14
16
18