问题How to use GCC's printf format attribute with C++11 variadic templates?与我的相似,但我在解决方案方面取得了更多进展。
GCC 4.8.1。暂且不谈(效率)问题,请采用以下方法
template <typename ... Ts>
__attribute__((format(printf, 1, 0)))
inline std::string stdprintf(const char *format, Ts ...ts) {
char buf[256];
snprintf(buf, 256, format, ts...);
return std::string(buf);
}
根据documentation,我必须在format(printf, 1, 0))
中设置0而不是2,因为printf以可变方式使用。数字表示函数的哪个参数是格式字符串,哪个是要检查与%格式说明符一致的第一个参数。 0导致检查更弱。
然而,在模板扩展之后,函数不是真正的变量。这只是gcc在扩展之前坚持要看这个问题吗?