c++命令行宏预处理器无法替换单词

标签 c++ c-preprocessor preprocessor-directive

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

我认为预处理器应该将 ARRAY 识别为 array1,然后将 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++ 中可能会有更好的实现;我很困惑你为什么要使用命令行在算法之间切换)。

关于c++命令行宏预处理器无法替换单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173445/

相关文章:

c++ - 指向结构错误CDCDCD的C++结构指针

c++ - 在托管 C++ GUI 中通过另一个事件结束/中断/切换一个事件

c++ - 如何设置 Visual Studio 以在全局范围内注册一些#defines?

c++ - STL iota 包含文件更改

c++ - 将一维数组视为二维数组

c++ - 如何在 C++ 宏参数中使用括号?

c++ - 如何在C++中实现static_cast

c++ - C/C++ 中的默认 int 主参数

c - 如何理解宏定义不变

c# - #if(DEBUG) 和 log4net 行号源/运行时不匹配