gpt4 book ai didi

c++ - 如何在字段中存储格式字符串并避免格式非文字警告?

转载 作者:行者123 更新时间:2023-11-28 00:31:47 24 4
gpt4 key购买 nike

我知道您可以放置​​ __attribute__((__format__ (__printf__, 2, 0))) 以避免在函数需要传递将字符串格式化为 vsnprintf。但是在我的例子中,格式字符串被保存为一个用文字初始化的字段。像这样:

class Worker {
const char* format;
Worker(const char* f): format(f) {...}

void go() {
...
vsnprintf(..,..,format,..);
...
}
}

如何避免警告?

最佳答案

您可以使用 #pragma clang diagnostic ignored "-Wformat-nonliteral" 或将 clang 替换为 GCC:

#include <cstdio>
#include <cstdarg>

using namespace std;

class Worker {
const char* format;
Worker(const char* f): format(f) { }

void go(int j, ...) {
char data[256];
va_list args;
va_start(args, j);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"
vsnprintf(data, sizeof(data), format, args);
#pragma clang diagnostic pop
va_end(args);
fputs(data, stderr);
}
};

pushpop 限制了诊断处理的变化范围,因此只有一行免于警告。有关详细信息,请参阅 GNU diagnostic pragmasClang diagnostic pragmas .

上面的代码编译干净:

$ clang -O3 -g -std=c++11 -Wall -Wextra -Werror -Wformat-nonliteral -c clang.cc

它在 GCC 中大声失败。将 clang 替换为 GCC,它在 GCC 和 Clang 下都能干净地编译。

在 Mac OS X 10.9.2 Mavericks 上测试:

  • 海湾合作委员会(g++)4.8.2
  • Clang (clang) 'Apple LLVM 版本 5.1 (clang-503.0.38)(基于 LLVM 3.4svn)'。

关于c++ - 如何在字段中存储格式字符串并避免格式非文字警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22599762/

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