我正在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);
我認爲預處理器應該認識到ARRAY
是array1
,然後用array1_size
替換ARRAY_size
。我認爲不必定義另一個命令行宏來指定數組的大小是必要的,因爲我必須計算元素的數量,並且我將在這種情況下使用它事先知道陣列的大小。所以我讓編譯器確定數組的大小。下劃線是預處理器失敗的原因嗎?最好對數組的大小使用不同的命名約定,以使其正確預處理?你會建議什麼其他類型的方法來解決這個問題?
這不是'ARRAY',它是'ARRAY_size'。預處理器不能取代部分標識符是一件好事。試想一下,在那裏的所有宏中,可能有一個標識符包含在你的一箇中。 – chris
這就是我希望預處理器執行的操作,替換部分標識符。預處理器如何知道標識符何時結束?它是否由空白分隔? – Galaxy
是的,由任何不能繼續標識符的字符。 – chris