【发布时间】:2017-08-27 15:49:37
【问题描述】:
我在 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。我认为不必定义另一个命令行宏来指定数组的大小会很好,因为我必须计算元素的数量,并且我将在不需要的情况下使用它提前知道数组的大小。所以我让编译器确定数组的大小。下划线是预处理器失败的原因吗?最好对数组的大小使用不同的命名约定,以使其正确预处理?你会建议用什么其他方法来解决这个问题?
【问题讨论】:
-
那不是
ARRAY,是ARRAY_size。预处理器不替换标识符的一部分是一件好事。试想一下,在所有宏中,可能有一个其标识符包含在您的一个中。 -
这就是我希望预处理器做的事情,替换标识符的一部分。预处理器如何知道标识符何时结束?是否用空格分隔?
-
是的,任何不能继续标识符的字符。
-
如果我想将array1_size命名为数组的大小?这意味着这两个变量是直接相关的......我如何让预处理器使用一个命令行宏完美地替换它们?
-
您对
#ifdef块感到满意吗?
标签: c++ c-preprocessor preprocessor-directive