MST
星途 面试题库

面试题:C语言#define复杂代码片段替换应用

编写一个宏,它接受一个数组和数组的大小作为参数,使用#define定义代码片段,计算数组中所有元素的平方和。同时阐述预处理器在处理这个宏时的工作原理。
37.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#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;
}

预处理器工作原理

  1. 文本替换:预处理器在编译之前进行工作,它会在源文件中查找宏定义#define SQUARE_SUM(arr, size),并将所有出现SQUARE_SUM(arr, size)的地方替换为宏定义的代码片段。这里arrsize会被实际传入的数组名和数组大小所替代。
  2. 展开宏体:预处理器将宏体中的代码按照文本替换的规则进行展开。在这个例子中,预处理器会把宏体中的代码直接插入到调用宏的位置,就像在调用处直接编写了计算平方和的循环代码一样。
  3. 不进行类型检查:与函数不同,宏只是简单的文本替换,预处理器不会对宏参数进行类型检查。所以使用宏时需要确保传入的参数类型和宏体中的操作是兼容的,否则可能导致编译错误或未定义行为。