面试题答案
一键面试宏的设计思路
- 定义日志级别:通过宏定义不同的日志级别,例如
DEBUG
、INFO
、WARN
、ERROR
。 - 使用
#
和##
运算符:#
运算符用于将参数转换为字符串,##
运算符用于连接两个标记。 - 可变参数宏:C99 标准支持可变参数宏,利用这一特性来实现接受不同数量和类型的参数。
- 格式化输出:使用
printf
函数进行格式化输出到控制台。
实现代码
#include <stdio.h>
// 定义日志级别
#define DEBUG 0
#define INFO 1
#define WARN 2
#define ERROR 3
// 当前日志级别
#define CURRENT_LOG_LEVEL DEBUG
// 日志记录宏
#define LOG(level, ...) \
do { \
if (level <= CURRENT_LOG_LEVEL) { \
const char* level_str; \
switch (level) { \
case DEBUG: level_str = "DEBUG"; break; \
case INFO: level_str = "INFO"; break; \
case WARN: level_str = "WARN"; break; \
case ERROR: level_str = "ERROR"; break; \
default: level_str = "UNKNOWN"; break; \
} \
printf("[%s] ", level_str); \
printf(__VA_ARGS__); \
printf("\n"); \
} \
} while (0)
你可以这样使用这个宏:
int main() {
const char* var_name = "count";
int var_value = 10;
LOG(DEBUG, "Variable %s has value %d", var_name, var_value);
LOG(INFO, "This is an info message");
LOG(WARN, "This is a warning");
LOG(ERROR, "This is an error");
return 0;
}
在上述代码中:
- 首先定义了不同的日志级别
DEBUG
、INFO
、WARN
、ERROR
,并设置了当前日志级别CURRENT_LOG_LEVEL
。 LOG
宏接受一个日志级别参数level
和可变参数...
。- 在宏内部,首先判断当前日志级别是否满足输出条件。如果满足,根据
level
值确定日志级别的字符串表示。 - 使用
printf
函数输出日志级别字符串和格式化后的日志内容。__VA_ARGS__
是可变参数宏的占位符,它会被实际传入的可变参数替换。 - 在
main
函数中展示了不同日志级别的使用示例。