gpt4 book ai didi

c - 在预处理器中定义可变参数函数 #define

转载 作者:行者123 更新时间:2023-12-02 16:33:42 25 4
gpt4 key购买 nike

我试图在预处理器 #define 中定义一个 debug_log 函数,以便该函数仅存在于 Debug模式下。问题是我希望使用 variable_argument 函数:

#ifdef DEBUG
#define DEBUG_ENABLED 1
#else
#define DEBUG_ENABLED 0
#endif

#define debug_log(msg, ...) \
do { \
if (DEBUG_ENABLED) { \
char str[300]; \
int length = -1; \
va_list argList; \
va_start( argList, msg ); \
length = vsnprintf(str, sizeof(str), msg, argList); \
va_end( argList ); \
if (length > 0) \
{ \
fprintf(stderr, "%s, %d ",__func__, __LINE__); \
fprintf(stderr, "%s", str); \
fprintf(stderr,"\n"); \
} \
} \
} while (0) \

编译器正在返回:

error: ‘va_start’ used in function with fixed args[build] 20 | va_start( argList, msg ); \

谢谢你的帮助;)

最佳答案

您实际上并不是在此处定义函数。您正在定义一段代码,希望成为可变参数函数的一部分。当您调用此宏时,您很可能在可变参数函数中,因此出现错误。

相反,在 #if block 中定义一个实际函数,并在 #else block 中定义一个类似函数的虚拟宏,它什么都不做。

#ifdef DEBUG

#define debug_log(...) debug_log_impl(__func__, __LINE__, __VA_ARGS__)

void debug_log_impl(const char *func, int line, const char *msg, ...)
{
char str[300];
int length = -1;
va_list argList;
va_start( argList, msg );
length = vsnprintf(str, sizeof(str), msg, argList);
va_end( argList );
if (length > 0)
{
fprintf(stderr, "%s, %d ", func, line);
fprintf(stderr, "%s", str);
fprintf(stderr,"\n");
}
}

#else

#define debug_log(...) (void)0

#fi

评论中有一个关于为什么 (void)0 应该用于 #else 而不是空表达式的问题。假设您要使用 debug_log 作为逗号运算符的左操作数:

while (debug_log("iterating, x=%d",x), x>0)

根据上面的定义,如果未定义 DEBUG,则此行扩展为:

while ((void)0, x>0)

如果它是一个空表达式,它将扩展为:

while (, x>0)

语法错误

关于c - 在预处理器中定义可变参数函数 #define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63116697/

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