c - 使用 gcc 在 C 中类型安全的可变参数

标签 c gcc static-analysis c89

很多时候我希望函数接收可变数量的参数,例如以 NULL 结尾

#define push(stack_t stack, ...) _push(__VARARG__, NULL);
func _push(stack_t stack, char *s, ...) {
    va_list args;
    va_start(args, s);
    while (s = va_arg(args, char*)) push_single(stack, s);
}

如果 foo 接收到非 char* 变量,我可以指示 gcc 或 clang 发出警告吗?类似于 __attribute__(format),但用于相同指针类型的多个参数。

最佳答案

我知道您正在考虑以某种方式使用 __attribute__((sentinel)),但这是一个转移注意力的问题。

你想要的是做这样的事情:

#define push(s, args...) ({                   \
  char *_args[] = {args};                     \
  _push(s,_args,sizeof(_args)/sizeof(char*)); \
})

包装:

void _push(stack_t s, char *args[], int argn);

您可以完全按照您希望的方式编写!

然后你可以调用:

push(stack, "foo", "bar", "baz");
push(stack, "quux");

关于c - 使用 gcc 在 C 中类型安全的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533842/

相关文章:

c++ - 为什么首选 uint32_t 而不是 uint_fast32_t?

c - 二维数组给出错误的输出

gcc - 使用cygwin在Windows 7-64上编译gcc-7-20170212,==> wopen错误

C 非阻塞 UDP 套接字

c++ - 从C++中的共享库调用指向列表的静态指针

c - 如何让 GCC 在编译时评估函数?

java - Java EE项目的静态代码分析工具

java - 静态代码分析注释

ios - 如何从 swift 读取 C 全局变量?