C ++为自定义打印/日志功能的错误使用添加编译器警告

时间:2017-08-11 19:02:53

标签: c++ printing format compiler-warnings

我有以下功能,我希望在使用printf时有警告:

void LoggingManager::log(int32_t logLevel, const char *p_str, ...)
{
    va_list args;
    va_start(args, p_str);
    vsnprintf(s_LogginManagerBuffer, LOGGING_MANAGER_BUFFER_SIZE - 1, p_str, args);
    va_end(args);

    internalLog(s_LogginManagerBuffer);
}
如果我忘记在format-string中为其中一个标记添加一个参数,我想以某种方式发出警告。有太多(或错误的参数)的警告也会很棒。 由于忘记了日志功能中的参数,我最近遇到了一些崩溃。

如果不可能这样做,我怎么能重写我的功能,有警告但功能相同?

1 个答案:

答案 0 :(得分:4)

如果你正在使用gcc / g ++ / clang,你可以使用this page上指定的格式属性:

  

格式(archetype,string-index,first-to-check)

     

format属性指定函数采用printf,scanf,strftime或strfmon样式参数,这些参数应根据格式字符串进行类型检查。例如,声明:

     

extern int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3)));

     

使编译器检查对my_printf的调用中的参数,以便与printf样式格式字符串参数my_format保持一致。

__attribute__是在函数原型之前还是之后无关紧要。

所以在你的情况下你可以这样做:

class LoggingManager {
    ...
public:
    void log(int32_t logLevel, const char *p_str, ...) __attribute__((format (printf, 3, 4)));
    ...
};

请注意,因为这是一个成员函数,您需要考虑传递的隐式this参数。所以格式字符串实际上是第3个参数而不是第2个参数。 (format (printf, 3, 4)代替format (printf, 2, 3)

查看工作here