我创建了一个类,其中有一个可变模板方法。该方法调用 printf
函数。当在该方法中传递零个参数时,我会收到 gcc 编译器的警告:
warning: format not a string literal and no format arguments [-Wformat-security]
以下是一个简化的类示例:
class printer{
std::map<int,std::string> str;
public:
printer(){
str[0] = "null\n";
str[1] = "%4d\n";
str[2] = "%4d %4d\n";
str[3] = "%4d %4d\n%4d\n";
}
template<typename ...Args>
void print(Args... args){
printf(str[sizeof...(args)].c_str(),args...);
}
};
当使用 标签时,意味着段落结束。它通常与 标签一起使用来定义一个段落。
printer p;
p.print(23);
p.print(345,23);
一切编译顺利,但在使用时出现问题。printer p;
p.print();
我收到了编译警告
main.cpp: In instantiation of ‘void printer::print(Args ...) [with Args = {}]’:
main.cpp:23:11: required from here
main.cpp:17:50: warning: format not a string literal and no format arguments [-Wformat-security]
printf(str[sizeof...(args)].c_str(),args...);
当然,如果我只是调用
printf("null\n");
没有警告出现。
有人能解释一下这是为什么吗?
我能否在不禁用-Wformat-security
标志的情况下消除警告?
printf
吗?你正在调用C的printf
... - Antti Haapala -- Слава Україніstd::printf
... :) - hyde