因此,我尝试这样做是为了练习,只是为了获得理解,但是如果我在 test.cpp 中有一段代码,并且我想更改程序中的一行,例如“CONST N = 10”,它将 N 的值更改为不同的值通过 bash 脚本中的循环获取值我该怎么做?我最初的猜测是:
for x in 10 20
do
sed -i -e 's/const int N = 10;/const int N = '$x';/g' test.cpp
g++ test.cpp -o test.o
./test.o
sed -i -e 's/const int N = '$x';/const int N = 10;/g' test.cpp
done
其中 x 将运行 10 和 20,然后将这些值输入到程序中的变量值中...但我不确定这是否是我应该做的。任何帮助将不胜感激。
答案1
更好的方法是使用预处理器宏,您可以在编译行中定义它。因此将代码更改为:
#ifndef N_MAC
#define N_MAC 10
#endif
const int N = N_MAC;
然后用以下命令编译它:
g++ test.cpp -DN_MAC=$x -o test.o
$ifndef
当您不使用-DN_MAC
覆盖它时,该块会提供默认值。
答案2
您的循环似乎应该可以工作,它将重新编译程序以获得N
等于10
和的值20
。
然而。
1) 如果您想要 10 到 20 之间的所有 11 个值,则必须使用类似for x in {10..20}
或for ((x = 10 ; x <= 20 ; x++))
之类的东西。
2)两次更改源代码似乎有点无用,保留一个不变的基本版本然后根据需要进行修改可能会更干净,例如
sed -e 's/const int N = 10;/const int N = '"$x"';/g' base.cpp > test.cpp
g++ -Wall test.cpp -o test
./test
rm test.cpp test
或者甚至sed -Ee 's/^(const int N =)[^;]*;/\1 '"$x"';/g'
完全忽略赋值中的值。
3) 不要用于test.o
可执行文件。扩展.o
名暗示了一个目标文件,您可以通过运行 gcc -c test.c
.另外,在这种情况下x
仅包含数字,但为了安全起见,最好将其双引号,如上所述。
也就是说,修改程序以从命令行读取数字而不是为每个值重新编译不会太困难。这会将第一个参数分配给N
然后打印它(它是用 C 语言编写的,但据我所知,这些参数main
在 C++ 中的工作方式类似):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int N = 10;
if (argc > 1) N = atoi(argv[1]);
printf("N: %d\n", N);
return 0;
}