我想做一些类似于在 GCC 中如何对 printf 样式调用进行语法检查的事情(以确保参数列表实际上对于调用是正确的)。
我有一些函数采用可变数量的参数。无论传入多少参数,我都需要确保传递的最后一个参数是 a NULL
,而不是强制发送哪些参数。
有没有办法让 GCC 在编译时进行这种类型的语法检查?
我想做一些类似于在 GCC 中如何对 printf 样式调用进行语法检查的事情(以确保参数列表实际上对于调用是正确的)。
我有一些函数采用可变数量的参数。无论传入多少参数,我都需要确保传递的最后一个参数是 a NULL
,而不是强制发送哪些参数。
有没有办法让 GCC 在编译时进行这种类型的语法检查?
你可能需要哨兵函数属性,所以声明你的函数
void foo(int,double,...) __attribute__((sentinel));
您可以考虑使用插件或MELT扩展自定义 GCC,以更精确地检查您的可变参数函数。也就是说,您可以使用自己的属性扩展 GCC,这些属性可以进行更精确的检查(或者只是根据您的函数名称进行额外的检查)。
melt-examples 的例子是ex06/
对jansson库做类似的检查;不幸的是,该示例在 2012 年 10 月 18 日今天不完整,我仍在努力。
此外,您可以定义一个可变参数宏来调用这样的函数,方法是始终添加NULL
例如:
#define FOO(N,D,...) foo((N),(D),##__V_ARGS__,NULL)
然后通过编码FOO(i+3,3.14,"a")
你会得到foo((i+3),(3.14),"a",NULL)
,所以你确定NULL
附加了 a 。
Basile Starynkevitch 是对的,使用函数属性。还有很多其他有用的函数属性,比如能够告诉编译器“如果调用者没有检查这个函数的返回值,那就是一个错误。”
您可能还想看看夹板是否可以为您检查,但我不这么认为。我想它会留在我的记忆中。
如果你还没有读过这个 GCC 编译器标志页面,也可以这样做。里面有很多方便的支票。 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html