【发布时间】:2021-04-22 21:46:50
【问题描述】:
我有一个函数:
log(const char *domain, int log_level, const char *fmt, ...)
我希望第一个和第二个参数是可选的,所以就像可以进行以下调用:
log("SYSTEM-A", 1, "Example %s", "...message");
log(1, "Example %s", "...message");
log("Example %s", "...message");
我读过关于简洁的宏技巧,但是它们(几乎?)都依赖尾随参数来在辅助宏中“脱颖而出”:
HELPER_SELECT(_1, _2, _3, func, ...) func
但是我不能使用这种方法,因为log() 可以接受任意数量的可变参数。这有可能以某种方式克服吗?使用_Generics,可能吗?
【问题讨论】:
-
当这些参数丢失时函数会做什么?你能不能只拥有用默认值填充缺失参数的宏。例如
LOG_NO_DOMAIN(level, fmt, ...) log(NULL, level, fmt, __VA_ARGS__)? -
不要使用
log作为函数名,因为它是一个标准的C函数取自然对数。 -
函数如何知道第二个提供的参数是否“可选”?它不能。不在 C 中。
-
有点可行。然而,案例 1 和 3 缺乏独特性,因为两者都以
const char *开头,然后是int或 也许 是int。想想log("Ex %d %s", 42, "message");看起来像log(const char *domain, int log_level, const char *fmt)。总的来说,我认为 OP 的目标是尽可能的,但是作为代码需要解析%specifiers的第一个参数需要做很多工作。推荐替代目标。 -
你如何区分
log("SYSTEM-A", 1, "Example")和log("Example %d%s", 1, "...message")?
标签: c variadic-functions variadic