是否有标准的C / C ++函数,给定printf
格式字符串,返回它预期的参数数量? E.g:
num_printf_args("%d %s") == 2;
num_printf_args("%.1f%%") == 1;
num_printf_args("%*d") == 2;
只计算格式字符串中%
的数量将是第一个近似值,它适用于第一个示例,但显然不在第二个和第三个示例中。
我知道gcc可以做到这一点,因为在编译时它会在实际传递给printf
的参数数量(及其类型)与格式字符串不匹配时抱怨。
答案 0 :(得分:5)
没有标准功能。
但是,它很容易实现。
计算另一个%
未跟随的%
的数量。为1
的每个人添加%
后紧跟*
。
计算%
个字符的运行时,不允许重叠。因此,“%%% d”的值应为1
(不是0
,当然不是2
或3
)。
编辑 - 以下文字添加了以下来自user694733的评论
这对于您给出的三个示例中的格式字符串就足够了。但是,正如用户694733在评论中指出的那样,这不是全部。
一般而言,格式说明符遵循原型%[flags][width][.precision][length]specifier
。上面的方法是一个起点,适用于格式字符串没有flags
,*
说明符中可能width
,*
中没有precision
}说明符,并忽略length
和specifier
字段。对于通用格式字符串,需要考虑所有这些,并相应地解析字符串。这样做的努力取决于您需要计算的强大程度 - 例如,如果您需要检测无效的格式字符串,则需要付出更多努力。
答案 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)