MST

星途 面试题库

面试题:C语言宏定义的高级参数处理技巧

假设有一个宏定义,需要接受不定数量的参数,并且要对这些参数进行特定的处理(比如求这些参数的和),请写出实现这个宏定义的代码,并说明其中涉及到的高级技巧。
20.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在C语言中,可以使用可变参数宏来实现接受不定数量的参数并进行处理。以下是实现求这些参数和的宏定义代码:

#include <stdio.h>
#include <stdarg.h>

#define SUM(...) sum(__VA_ARGS__)

int sum(int num, ...) {
    va_list ap;
    int sum_value = num;
    va_start(ap, num);
    int n;
    while ((n = va_arg(ap, int))) {
        sum_value += n;
    }
    va_end(ap);
    return sum_value;
}

高级技巧说明:

  1. 可变参数宏(__VA_ARGS__:这是C99引入的特性,允许宏接受可变数量的参数。在宏定义 SUM(...) 中,... 表示可变参数,__VA_ARGS__ 则代表这些可变参数。
  2. stdarg.h 头文件:该头文件提供了一系列用于处理可变参数列表的宏和类型。
    • va_list:这是一个类型,用于表示可变参数列表。在 sum 函数中,我们声明了一个 va_list 类型的变量 ap 来操作可变参数列表。
    • va_start:这个宏用于初始化可变参数列表。它接受两个参数,第一个是 va_list 类型的变量,第二个是可变参数列表前的最后一个命名参数(在 sum 函数中是 num)。
    • va_arg:这个宏用于从可变参数列表中获取下一个参数。它接受两个参数,第一个是 va_list 类型的变量,第二个是要获取的参数的类型。在 sum 函数中,我们每次调用 va_arg(ap, int) 来获取下一个 int 类型的参数。
    • va_end:这个宏用于清理可变参数列表,释放相关资源。在使用完可变参数列表后,必须调用 va_end 来避免内存泄漏等问题。