따라서 이해를 돕기 위해 연습용으로 이 작업을 수행하려고 합니다. 하지만 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
귀하의 루프는 제대로 작동하는 것처럼 보이며 프로그램을 다시 컴파일하여 sum 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;
}