[英]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
,当然也不能是2
或3
)。
编辑-下面的文本在user694733的评论之后添加
按照您给出的三个示例,这足以满足格式字符串的要求。 但是,正如user694733在评论中指出的,这不是全部。
一般而言,格式说明符遵循原型%[flags][width][.precision][length]specifier
。 上面的方法是起点,并且将用于格式字符串工作已经没有flags
,可能的*
在width
说明符,没有*
的precision
说明符,俯瞰length
和specifier
字段。 对于一般格式的字符串,需要考虑所有这些因素,并相应地分析该字符串。 要做的工作取决于您需要的计数稳健性-例如,如果需要检测无效的格式字符串,则需要做更多的工作。
我不确定您为什么需要这样做 ,但是您的问题可能会以这种方式解决(此问题的答案: 可变参数宏技巧 )。
如注释中所建议,您可以将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.