2017-04-02 15 views
0

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를 교체해야한다고 생각합니다. 필자는 배열의 크기를 지정하는 또 다른 명령 행 매크로를 정의 할 필요가 없다는 것이 좋을 것입니다. 왜냐하면 요소의 수를 세지 않으면 안되며, 그렇지 않은 상황에서는 이것을 사용할 것입니다. 사전에 배열의 크기를 알아야합니다. 그래서 나는 컴파일러가 배열의 크기를 결정하도록했습니다. 밑줄이 전처리 기가 실패한 이유입니까? 배열의 크기에 대해 다른 이름 지정 규칙을 사용하여 올바르게 사전 처리되도록하는 것이 좋습니다. 이 문제를 해결하기 위해 어떤 다른 접근 방식을 제안 하시겠습니까?

처리기 관점에서
+0

그건'ARRAY'가 아니라'ARRAY_size'입니다. 전처리 기가 식별자의 일부를 대체하지 않는 것이 좋습니다. 상상해보십시오. 매크로의 모든 매크로 중에서 식별자가 포함 된 매크로가있을 수 있습니다. – chris

+0

전처리 기가 식별자의 일부를 대체하기를 원하는 것입니다. 전처리 기는 식별자가 끝나는 시점을 어떻게 알 수 있습니까? 공백으로 구분됩니까? – Galaxy

+0

예, 식별자를 계속할 수없는 문자. – chris

답변

1

, 당신은 매크로 FOOBAR를로 정의하고 FOO_sizeBAR_size 때문에 FOOFOO_size 다른 토큰입니다 될 것으로 예상 할 수 없다.

당신은, 그러나,이 스테이지에 붙여 넣기 매크로를 만들 수 있습니다 인수 확장 할 수 있도록 간접적 인 매크로 쌍에 와서

#define GLUE(a,b) GLUEI(a,b) 
#define GLUEI(a,b) a##b 
... 
int* sorted_array = SORT_ALG(ARRAY, GLUE(ARRAY,_size)); 

매크로 필요합니다. 매크로 확장 규칙으로 인해 매크로의 ARRAY이 먼저 간접적으로 확장됩니다. 즉, 붙여 넣기 전에 적용 할 다른 것으로 정의하는 경우입니다.

하지만 전처리 기용 퍼스펙티브 외부에서 왜 어쨌든 일치하는 쌍 토큰을 사용하는 것을 귀찮게하고 있습니까? array1_sizesizeof(array1)/sizeof(array1[0])에 할당하려는 경우이 값을 SORT_ALG(ARRAY, (sizeof(ARRAY)/sizeof(ARRAY[0])))으로 변경할 수 있습니다.

(정확히 무엇을하고 있습니까? 특정 벤치마킹보다 더 복잡한 작업을 수행하는 경우 C++의 구현이 훨씬 더 빨라질 수 있으며, 알고리즘 사이를 전환하는 명령 행).

+0

두 번째 제안에 동의합니다. 더 나은 해결책 인 것 같습니다. – Galaxy