#include <stdio.h>
// 定义宏来计算数组元素的平方和
#define SQUARE_SUM(arr, size) ({ \
int sum = 0; \
for (int i = 0; i < size; i++) { \
sum += (arr[i] * arr[i]); \
} \
sum; \
})
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
int result = SQUARE_SUM(arr, size);
printf("数组元素的平方和为: %d\n", result);
return 0;
}
预处理器工作原理
- 文本替换:预处理器在编译之前进行工作,它会在源文件中查找宏定义
#define SQUARE_SUM(arr, size)
,并将所有出现SQUARE_SUM(arr, size)
的地方替换为宏定义的代码片段。这里arr
和size
会被实际传入的数组名和数组大小所替代。
- 展开宏体:预处理器将宏体中的代码按照文本替换的规则进行展开。在这个例子中,预处理器会把宏体中的代码直接插入到调用宏的位置,就像在调用处直接编写了计算平方和的循环代码一样。
- 不进行类型检查:与函数不同,宏只是简单的文本替换,预处理器不会对宏参数进行类型检查。所以使用宏时需要确保传入的参数类型和宏体中的操作是兼容的,否则可能导致编译错误或未定义行为。