繁体   English   中英

确定printf参数的数量

[英]Determine number of printf arguments

在给定printf格式字符串的情况下,是否有标准的C / C ++函数返回期望的参数数量? 例如:

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

仅计算格式字符串中的%数将是一个第一近似值,这在第一个示例中有效,但显然在第二个和第三个示例中无效。

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

没有标准功能可以执行此操作。

但是,这很容易实现。

张数%未再接再% 计数的每个%的加1立即紧跟一个*

计算%字符的游程时,不允许重叠。 因此,“ %%% d”的结果应为1 (而不是0 ,当然也不能是23 )。

编辑-下面的文本在user694733的评论之后添加

按照您给出的三个示例,这足以满足格式字符串的要求。 但是,正如user694733在评论中指出的,这不是全部。

一般而言,格式说明符遵循原型%[flags][width][.precision][length]specifier 上面的方法是起点,并且将用于格式字符串工作已经没有flags ,可能的*width说明符,没有*precision说明符,俯瞰lengthspecifier字段。 对于一般格式的字符串,需要考虑所有这些因素,并相应地分析该字符串。 要做的工作取决于您需要的计数稳健性-例如,如果需要检测无效的格式字符串,则需要做更多的工作。

我不确定您为什么需要这样做 ,但是您的问题可能会以这种方式解决(此问题的答案: 可变参数宏技巧 )。

如注释中所建议,您可以将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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM