2017-04-02 88 views
0

我正在Linux終端命令行環境中工作,沒有IDE。我用g ++編譯我的C++程序。這取決於使用命令行宏來執行不同的代碼語句,而無需更改源代碼本身。這裏是我有一個問題的代碼塊。我有幾個不同的數組,我想執行排序。然後,我在源代碼的其他地方執行該排序並返回排序後的數組。我想使用命令行宏來告訴預處理器我想要使用哪個數組,以及使用哪種排序算法(調用哪個函數)。 SORT_ALG應該替換爲函數的名稱,並且ARRAY應該替換爲數組的名稱。預處理後,所以,此行應該是這樣的:C++命令行宏預處理器無法替換字

int* sorted_array = BubbleSort(array1, array1_size); 

這裏是源代碼:

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相應的變量: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); 

我認爲預處理器應該認識到ARRAYarray1,然後用array1_size替換ARRAY_size。我認爲不必定義另一個命令行宏來指定數組的大小是必要的,因爲我必須計算元素的數量,並且我將在這種情況下使用它事先知道陣列的大小。所以我讓編譯器確定數組的大小。下劃線是預處理器失敗的原因嗎?最好對數組的大小使用不同的命名約定,以使其正確預處理?你會建議什麼其他類型的方法來解決這個問題?

+0

這不是'ARRAY',它是'ARRAY_size'。預處理器不能取代部分標識符是一件好事。試想一下,在那裏的所有宏中,可能有一個標識符包含在你的一箇中。 – chris

+0

這就是我希望預處理器執行的操作,替換部分標識符。預處理器如何知道標識符何時結束?它是否由空白分隔? – Galaxy

+0

是的,由任何不能繼續標識符的字符。 – chris

回答

1

從預處理的角度來看,你不能定義一個宏FOOBAR,並期望FOO_size成爲BAR_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_size只是將被分配到sizeof(array1)/sizeof(array1[0]),您可以將其更改爲SORT_ALG(ARRAY, (sizeof(ARRAY)/sizeof(ARRAY[0])))。 (另外,你究竟在做什麼?看起來好像在C++中可能會有更好的實現,如果你做的任何事情都比基準測試更復雜;而且我很困惑你爲什麼要使用命令行在算法之間切換)。

+0

我同意你的第二個建議。這似乎是一個更好的解決方案。 – Galaxy