gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:52:38 26 4
gpt4 key购买 nike

我有以下功能,我想像使用 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);
}

如果我忘记为格式字符串中的其中一个标记添加参数,我想以某种方式收到警告。对于有太多(或错误的参数)的警告也会很棒。由于忘记了日志记录函数中的参数,我最近遇到了一些崩溃。

如果不能这样做,我该如何重写我的函数,使其具有警告但功能相同?

最佳答案

如果您使用的是 gcc/g++/clang,您可以使用 this page 上指定的 format 属性:

format (archetype, string-index, first-to-check)

The format attribute specifies that a function takes printf, scanf, strftime or strfmon style arguments that should be type-checked against a format string. For example, the declaration:

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

causes the compiler to check the arguments in calls to my_printf for consistency with the printf style format string argument my_format.

__attribute__ 是在函数原型(prototype)之前还是之后都没有关系。

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

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

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

看看效果如何 here .

关于C++ 为错误使用自定义打印/日志功能添加编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com