我在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
。我认为不必定义另一个命令行宏来指定数组的大小是好的,因为我必须计算元素的数量,并且我将在我不喜欢的情况下使用它。 #39;事先知道数组的大小。所以我让编译器确定数组的大小。下划线是预处理器失败的原因吗?最好对数组的大小使用不同的命名约定,以使其正确预处理?你会建议用什么其他方法来解决这个问题?
答案 0 :(得分:1)
从预处理器的角度来看,您无法将宏FOO
定义为BAR
并期望FOO_size
成为BAR_size
,因为FOO
和{{ 1}}是不同的令牌。
但是,您可以创建一个粘贴宏来进行演示:
FOO_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])
。
(另外,你到底在做什么?看起来如果你做的事情比基准测试更复杂的话,可能会有更好的C ++实现;我很困惑你为什么要使用这个命令行在算法之间切换。)