C++命令行宏预处理器无法替换Word

C++命令行宏预处理器无法替换Word,c++,c-preprocessor,preprocessor-directive,C++,C Preprocessor,Preprocessor Directive,我在Linux终端命令行环境中工作,没有IDE。我用G++编译我的C++程序。这取决于使用命令行宏执行不同的代码语句,而不改变源代码本身。下面是我遇到问题的代码块。我想对几个不同的数组执行排序。然后在源代码中的其他地方有一些函数执行排序并返回排序后的数组。我想使用命令行宏告诉预处理器我要使用哪个数组,以及使用哪个排序算法调用哪个函数。SORT_ALG应替换为函数名,ARRAY应替换为数组名。因此,预处理后,该行应如下所示: int* sorted_array = BubbleSort(array

我在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;

我认为预处理器应该识别数组是array1,然后用array1\u大小替换array1\u大小。我认为最好不必定义另一个命令行宏来指定数组的大小,因为我必须计算元素的数量,我将在我事先不知道数组大小的情况下使用它。因此,我让编译器确定数组的大小。下划线是预处理器失败的原因吗?最好对数组的大小使用不同的命名约定,以便正确地对其进行预处理?您建议采用什么其他方法来解决此问题

从预处理器的角度来看,不能将宏FOO定义为BAR,而期望FOO_size变成BAR_size,因为FOO和FOO_size是不同的标记

但是,您可以创建粘贴宏来暂存以下内容:

#define GLUE(a,b) GLUEI(a,b)
#define GLUEI(a,b) a##b
...
int* sorted_array = SORT_ALG(ARRAY, GLUE(ARRAY,_size));
宏需要与间接宏成对出现,以允许其参数展开。由于宏扩展规则,宏中的数组将首先在给定间接寻址的情况下扩展,这意味着如果您将其定义为粘贴之前将应用的其他内容

但是在预处理器之外,为什么还要费心使用匹配对标记呢?如果array1_大小只是要分配给sizeofarray1/sizeofarray1[0],您可以将其更改为SORT_ALGARRAY、sizeofARRAY/sizeofARRAY[0]


还有,你到底在这里干什么?看起来,如果你做的事情比标明特定的东西更复杂,C++中可能会有更好的实现;我不明白为什么要使用命令行在算法之间切换。

这不是数组,而是数组大小。最好预处理器不替换标识符的一部分。想象一下,在所有的宏中,可能有一个宏的标识符包含在您的宏中。这就是我希望预处理器做的,替换标识符的一部分。预处理器如何知道标识符何时结束?它是由空格分隔的吗?是的,由任何不能继续标识符的字符分隔。如果我想将数组的大小命名为array1_size?这意味着这两个变量都是直接相关的…我如何让预处理器使用一个命令行宏完美地替换这两个变量?您对ifdef块感到满意吗?我同意您的第二个建议。这似乎是一个更好的解决方案。
#define GLUE(a,b) GLUEI(a,b)
#define GLUEI(a,b) a##b
...
int* sorted_array = SORT_ALG(ARRAY, GLUE(ARRAY,_size));