gpt4 book ai didi

检查 C 中是否有可变参数

转载 作者:行者123 更新时间:2023-12-05 01:52:43 27 4
gpt4 key购买 nike

我有如下日志功能

void log_error(char * file_name, int line_num, int err_code) {
printf("%s:%d:%s\n", file_name, line_num, get_err_str(err_code));
}

我想更改它以选择传递自定义格式字符串和 args 以获取其他信息,例如

void log_error(char * file_name, int line_num, int err_code, ...) {
va_list ptr;
char * fmt;
printf("%s:%d:%s", file_name, line_num, get_err_str(err_code));

va_start(ptr, err_code);
fmt = va_arg(ptr, char *);

vprintf(fmt, ptr);
printf("\n");
}

但我不想强制传递这些额外信息,所以我可能无法获得 fmt 和所需的额外参数,这可能会导致代码失败,有没有办法检查是否有在尝试访问它们之前是可变参数吗?或者我的用例的唯一选择是定义 2 个不同的函数,就像这样

void log_error(char * file_name, int line_num, int err_code) {
printf("%s:%d:%s\n", file_name, line_num, get_err_str(err_code));
}

void log_error(char * file_name, int line_num, int err_code, const char * fmt, ...) {
va_list ptr;
printf("%s:%d:%s", file_name, line_num, get_err_str(err_code));

va_start(ptr, err_code);
vprintf(fmt, ptr);
printf("\n");
va_end(ptr);
}

最佳答案

如果没有至少一个告诉您正在发生什么的非可变参数,您将无法检查函数中的可变参数,但是您可以使用扩展为“正确”可变参数函数调用的可变参数宏。由于您可能已经在使用宏来提供 __FILE____LINE__,因此您可能会执行以下操作:

// this is the function that will be called by the macro
void log_error_func(char * file_name, int line_num, int err_code, const char *fmt, ...);

// this is the macro that will be used to log
#define log_error(CODE, ...) log_error_func(__FILE__, __LINE__, CODE, "" __VA_ARGS__)

现在你可以使用类似的东西了

log_error(42, "this error has args: %d, %d, %d", 1, 2, 3);

还有

log_error(5);   /* no args here */

而且它们会像人们期望的那样工作。在这样的宏中使用 "" 要求格式 arg(如果存在)是字符串文字,因此空字符串将被正确地添加到前面。

关于检查 C 中是否有可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71503900/

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