面试题答案
一键面试#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;
}
这个宏实现过程如下:
- 使用
va_list
来处理可变参数。 - 通过
va_start
初始化可变参数列表。 - 尝试通过
sscanf
判断参数类型并打印对应的值。 - 最后通过
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;
}