确定printf参数的数量

时间:2016-06-21 08:15:46

标签: c

是否有标准的C / C ++函数,给定printf格式字符串,返回它预期的参数数量? E.g:

num_printf_args("%d %s") == 2;
num_printf_args("%.1f%%") == 1;
num_printf_args("%*d") == 2;

只计算格式字符串中%的数量将是第一个近似值,它适用于第一个示例,但显然不在第二个和第三个示例中。

我知道gcc可以做到这一点,因为在编译时它会在实际传递给printf的参数数量(及其类型)与格式字符串不匹配时抱怨。

2 个答案:

答案 0 :(得分:5)

没有标准功能。

但是,它很容易实现。

计算另一个%未跟随的%的数量。为1的每个人添加%后紧跟*

计算%个字符的运行时,不允许重叠。因此,“%%% d”的值应为1(不是0,当然不是23)。

编辑 - 以下文字添加了以下来自user694733的评论

这对于您给出的三个示例中的格式字符串就足够了。但是,正如用户694733在评论中指出的那样,这不是全部。

一般而言,格式说明符遵循原型%[flags][width][.precision][length]specifier。上面的方法是一个起点,适用于格式字符串没有flags*说明符中可能width*中没有precision }说明符,并忽略lengthspecifier字段。对于通用格式字符串,需要考虑所有这些,并相应地解析字符串。这样做的努力取决于您需要计算的强大程度 - 例如,如果您需要检测无效的格式字符串,则需要付出更多努力。

答案 1 :(得分:2)

我不确定你为什么需要这个,但你的问题可能this way中得到解决(从这个问题接受回答:Variadic macro trick)。

正如评论中所建议的那样,您可以将printf的调用包装到一个宏中,该宏将首先计算所需的参数数量,然后继续执行您想要执行的操作。

博客文章中的代码:

#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 5,4,3,2,1)
#define VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N

// to verify, run the preprocessor alone (g++ -E):
VA_NUM_ARGS(x,y,z)