MST
星途 面试题库

面试题:C语言可变参数宏处理不同类型参数

在C语言中,实现一个可变参数宏 `PRINT_VALUES`,它能够处理不同类型(如整数、浮点数、字符串)的参数,并在控制台打印出这些参数的值。要求在宏定义中处理好不同类型的格式化输出。
25.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

#define PRINT_VALUES(...) \
    do { \
        printf("Printing values:\n"); \
        va_list args; \
        va_start(args, __VA_ARGS__); \
        int _int_arg; \
        double _double_arg; \
        const char* _str_arg; \
        int _is_int = 1; \
        int _is_double = 1; \
        int _is_str = 1; \
        (void)(__VA_ARGS__); \
        _is_int = sscanf(va_arg(args, const char*), "%d", &_int_arg) == 1; \
        _is_double = sscanf(va_arg(args, const char*), "%lf", &_double_arg) == 1; \
        _is_str = 1; \
        if (_is_int) { \
            printf("Integer value: %d\n", _int_arg); \
        } else if (_is_double) { \
            printf("Double value: %lf\n", _double_arg); \
        } else { \
            _str_arg = va_arg(args, const char*); \
            printf("String value: %s\n", _str_arg); \
        } \
        va_end(args); \
    } while (0)

你可以这样使用这个宏:

int main() {
    PRINT_VALUES("123", "3.14", "Hello, World!");
    return 0;
}

这个宏实现过程如下:

  1. 使用 va_list 来处理可变参数。
  2. 通过 va_start 初始化可变参数列表。
  3. 尝试通过 sscanf 判断参数类型并打印对应的值。
  4. 最后通过 va_end 清理可变参数列表。

注意:这种实现是较为复杂的方式,实际中可以通过多次调用宏,针对不同类型分别定义宏处理会更简单清晰,例如:

#define PRINT_INT(x) printf("Integer value: %d\n", x)
#define PRINT_DOUBLE(x) printf("Double value: %lf\n", x)
#define PRINT_STRING(x) printf("String value: %s\n", x)

使用时:

int main() {
    int num = 10;
    double d = 3.14;
    const char* str = "Hello";
    PRINT_INT(num);
    PRINT_DOUBLE(d);
    PRINT_STRING(str);
    return 0;
}