gpt4 book ai didi

c++ - 如何在类成员函数内部的printf中获取编译警告

转载 作者:行者123 更新时间:2023-11-30 04:59:09 30 4
gpt4 key购买 nike

我想编写记录器,使用 printf 函数将日志打印到控制台。

假设我有以下代码:

class Logger {
public:
Logger(std::string header = "") : header_(header) {}
template<class ...Args>
void LogInfo(const char* message, Args... args);
private:
std::string header_;
};

template<class ...Args>
void Logger::LogInfo(const char* message, Args... args) {
printf(message, args...);
}

这记录很好,但问题是当我调用时:

const char* s = "Monty Python";
Logger logger("[Header]");
logger.LogInfo("%d", s);

记录器在没有任何警告的情况下打印指针值,而 printf 调用导致错误(使用我的编译标志)

error: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘const char*’ [-Werror=format=]
printf("%d", s);

整个代码的重点是我想在 LogInfo 调用期间得到这个错误。我怎么能做这样的事情?

最佳答案

回退到 printf 函数系列和格式字符串会让您回想起很多有关类型安全的问题您可能会更好地使用现代 C++ 流机制。当然,人们不会真的想像这样记录:

logger << "first: " << x << "second: " << y << commit;

因此想出了一些替代方法来避免需要适当的格式字符串参数的问题;想法如下:

  • 在格式字符串的指定位置依次插入参数
  • 插入位置由字符模式 %#
  • 标识
  • pattern %## 抑制参数插入并替换为字符串形式的插入模式

缺点:我们必须自己做解析:

void logInfo(char const* message)
{
char const* m = message;
while((m = strchr(m, '%')))
{
if(*++m == '#')
{
if(*++m != '#')
{
std::cout.write(message, m - message - 2);
std::cout << "<missing argument>";
}
else
{
std::cout.write(message, m - message);
++m;
}
message = m;
}
}
std::cout << message << std::endl;
}

template<typename A, typename ... AA>
void logInfo(char const* message, A a, AA ... aa)
{
char const* m = message;
while((m = strchr(m, '%')))
{
if(*++m == '#')
{
if(*++m != '#')
{
std::cout.write(message, m - message - 2);
std::cout << a;
return logInfo(m, aa...);
}
std::cout.write(message, m - message);
message = ++m;
}
}
std::cout << message << std::endl;
}

当然,还有一些通用代码,留给你优化,这只是为了想法......

在以下示例中运行良好:

logInfo("t1");
logInfo("t2", 7);
logInfo("t3: %#", 12);
logInfo("t4: %#%##", 10);
logInfo("t5: %#%%#", 12);
logInfo("t6: %#% baz", 10);
logInfo("t7 1: %# 2: %# 3: %#", 10, 12);

您可以添加更多格式设置选项,例如最小输出宽度、填充字符、精度……——就像 printf 提供的一样……

当然,这个答案与您的问题(“如何产生警告”)完全不匹配,相反,它只是让警告过时了...

关于c++ - 如何在类成员函数内部的printf中获取编译警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381062/

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