gpt4 book ai didi

C宏扩展成多个函数定义

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:52 24 4
gpt4 key购买 nike

我有 3 个非常相似的日志函数,它们将从不同的地方调用。

void INFO (char *format, ...) {
char log_buf[256] = {0};
va_list args;
va_start(args, format);
vsprintf(log_buf, format, args);
va_end(args);
LIB_LOG_INFO(log_buf);
}

void ERROR (char *format, ...) {
char log_buf[256] = {0};
va_list args;
va_start(args, format);
vsprintf(log_buf, format, args);
va_end(args);
LIB_LOG_ERROR(log_buf);
}

void DEBUG (char *format, ...) {
char log_buf[256] = {0};
va_list args;
va_start(args, format);
vsprintf(log_buf, format, args);
va_end(args);
LIB_LOG_DEBUG(log_buf);
}

我不能传递任何额外的参数,所以我不能做一个 if-else 来调用不同的 LIB_LOG 函数。

是否可以编写一个在编译时扩展为这 3 个函数定义的通用宏?只有 LIB_LOG 函数的名称不同。

最佳答案

首先请注意,可变参数函数几乎肯定是任何问题的错误解决方案。它们将被视为已弃用的危险功能 - 尽可能避免使用它们。

话虽如此,您可以通过制作一个带有函数指针参数的通用函数来解决您的问题:

typedef void lib_log_func_t (char* buf);

void lib_log (lib_log_func_t* func, const char* format, ...)
{
char log_buf[256] = {0};
va_list args;
vsprintf(log_buf, format, args);
va_end(args);
func(log_buf);
}

然后写3个包装宏:

#define INFO(format, ...)  lib_log(LIB_LOG_INFO,  format, __VA_ARGS__)
#define ERROR(format, ...) lib_log(LIB_LOG_ERROR, format, __VA_ARGS__)
#define DEBUG(format, ...) lib_log(LIB_LOG_ERROR, format, __VA_ARGS__)

关于C宏扩展成多个函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58442576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com