1

我想做一些类似于在 GCC 中如何对 printf 样式调用进行语法检查的事情(以确保参数列表实际上对于调用是正确的)。

我有一些函数采用可变数量的参数。无论传入多少参数,我都需要确保传递的最后一个参数是 a NULL,而不是强制发送哪些参数。

有没有办法让 GCC 在编译时进行这种类型的语法检查?

4

2 回答 2

4

你可能需要哨兵函数属性,所以声明你的函数

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 。

于 2012-10-18T19:48:33.170 回答
1

Basile Starynkevitch 是对的,使用函数属性。还有很多其他有用的函数属性,比如能够告诉编译器“如果调用者没有检查这个函数的返回值,那就是一个错误。”

您可能还想看看夹板是否可以为您检查,但我不这么认为。我想它会留在我的记忆中。

如果你还没有读过这个 GCC 编译器标志页面,也可以这样做。里面有很多方便的支票。 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

于 2012-10-18T19:48:59.837 回答