簡體   English   中英

C ++命令行宏預處理器無法替換單詞

[英]c++ command line macros preprocessor fails to replace word

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

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 ,然后將ARRAY_size替換為array1_size 我認為最好不必定義另一個命令行宏來指定數組的大小,因為我必須計算元素的數量,並且在不使用這種情況的情況下,我將使用它提前知道數組的大小。 因此,我讓編譯器確定數組的大小。 下划線是預處理器無法完成其工作的原因嗎? 最好對數組的大小使用其他命名約定,以便對其進行正確的預處理? 您會建議采用哪種其他方法來解決此問題?

從預處理程序的角度來看,您不能將宏FOO定義為BAR並且不能期望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 ++中實現更好的實現;而且我很困惑您為什么使用命令行進行切換算法之間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM