Linux 사용자가 아닌 명령 줄 환경에서 IDE를 사용하고 있습니다. g ++로 C++ 프로그램을 컴파일합니다. 이 방법은 명령 줄 매크로를 사용하여 소스 코드 자체를 변경하지 않고도 다른 코드 문을 실행하는 방법에 따라 달라집니다. 여기에 문제가있는 코드 덩어리가 있습니다. 정렬을 수행 할 여러 배열이 있습니다. 그런 다음 정렬을 수행하고 정렬 된 배열을 반환하는 소스 코드의 다른 기능이 있습니다. 전 커맨드 라인 매크로를 사용하여 전처리기에 어떤 배열을 사용할 것인지, 어떤 정렬 알고리즘을 사용할 것인지 (호출 할 함수)를 알려주고 싶습니다. SORT_ALG
은 함수의 이름으로 바꾸고 ARRAY
은 배열의 이름으로 대체해야합니다. 그래서 전처리 한 후, 라인은 다음과 같아야합니다C++ 명령 줄 매크로 전처리 기가 단어를 대체하지 못함
int array1[] = {24, 13, 9, 64, 7, 23, 34, 47};
int array1_size = sizeof(array1)/sizeof(array1[0]);
// an already sorted array!
int array2[] = {1, 2, 5, 8, 10, 15, 20, 25, 30};
int array2_size = sizeof(array2)/sizeof(array2[0]);
// a reverse sorted array!
int array3[] = {75, 50, 45, 30, 25, 18, 17, 12, 10, 6, 5};
int array3_size = sizeof(array3)/sizeof(array3[0]);
/*
* This code uses command line macros defined by g++
* SORT_ALG should be one of the sorting function names such as:
* BubbleSort
* BubbleSortOptimized
* ARRAY should be the name of one of the arrays, without the brackets:
* array1
* array2
* array3
* Example of compiling the program with g++ using command line macros:
* g++ -D SORT_ALG=BubbleSort -D ARRAY=array1 sorting.cpp
*/
int* sorted_array = SORT_ALG(ARRAY, ARRAY_size);
cout << "The sorted array: ";
PrintArray(sorted_array, ARRAY_size);
cout << endl;
나는 소스 코드를 컴파일하려고, 전처리와 ARRAY_size
를 대체하는 인식하지 않습니다 여기에
int* sorted_array = BubbleSort(array1, array1_size);
는 소스 코드 해당 변수 :
array1_size
.
$ g++ -D SORT_ALG=BubbleSort -D ARRAY=array1 sorting.cpp
sorting.cpp: In function ‘int main()’:
sorting.cpp:139:39: error: ‘ARRAY_size’ was not declared in this scope
int* sorted_array = SORT_ALG(ARRAY, ARRAY_size);
나는 전처리가 ARRAY
되는 array1
을 인식하고 array1_size
으로 ARRAY_size
를 교체해야한다고 생각합니다. 필자는 배열의 크기를 지정하는 또 다른 명령 행 매크로를 정의 할 필요가 없다는 것이 좋을 것입니다. 왜냐하면 요소의 수를 세지 않으면 안되며, 그렇지 않은 상황에서는 이것을 사용할 것입니다. 사전에 배열의 크기를 알아야합니다. 그래서 나는 컴파일러가 배열의 크기를 결정하도록했습니다. 밑줄이 전처리 기가 실패한 이유입니까? 배열의 크기에 대해 다른 이름 지정 규칙을 사용하여 올바르게 사전 처리되도록하는 것이 좋습니다. 이 문제를 해결하기 위해 어떤 다른 접근 방식을 제안 하시겠습니까?
그건'ARRAY'가 아니라'ARRAY_size'입니다. 전처리 기가 식별자의 일부를 대체하지 않는 것이 좋습니다. 상상해보십시오. 매크로의 모든 매크로 중에서 식별자가 포함 된 매크로가있을 수 있습니다. – chris
전처리 기가 식별자의 일부를 대체하기를 원하는 것입니다. 전처리 기는 식별자가 끝나는 시점을 어떻게 알 수 있습니까? 공백으로 구분됩니까? – Galaxy
예, 식별자를 계속할 수없는 문자. – chris