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

C++ 如何在字段中存储格式字符串并避免格式非文字警告?,c++,clang,printf,C++,Clang,Printf,我知道,如果函数需要将格式字符串传递到vsnprintf中,您可以放置\uuuuu属性((\uuuuuu格式\uuuuuuu(\ uuuu打印f\uuuuuuu2,0)),以避免出现“格式字符串不是字符串文字”的叮当警告。但是,在我的例子中,格式字符串保存为一个字段,该字段用文本初始化。大概是这样的: class Worker { const char* format; Worker(const char* f): format(f) {...} void go() {

我知道,如果函数需要将格式字符串传递到vsnprintf中,您可以放置
\uuuuu属性((\uuuuuu格式\uuuuuuu(\ uuuu打印f\uuuuuuu2,0))
,以避免出现“格式字符串不是字符串文字”的叮当警告。但是,在我的例子中,格式字符串保存为一个字段,该字段用文本初始化。大概是这样的:

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);
    }
};
它在GCC中失败得很厉害。将
clang
替换为
GCC
,它可以在GCC和clang下干净地编译

在Mac OS X 10.9.2 Mavericks上测试,具有:

  • GCC(
    g++
    )4.8.2
  • Clang(
    Clang
    )“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”
您可以使用
#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);
    }
};
它在GCC中失败得很厉害。将
clang
替换为
GCC
,它可以在GCC和clang下干净地编译

在Mac OS X 10.9.2 Mavericks上测试,具有:

  • GCC(
    g++
    )4.8.2
  • Clang(
    Clang
    )“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”
您可以使用
#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);
    }
};
它在GCC中失败得很厉害。将
clang
替换为
GCC
,它可以在GCC和clang下干净地编译

在Mac OS X 10.9.2 Mavericks上测试,具有:

  • GCC(
    g++
    )4.8.2
  • Clang(
    Clang
    )“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”
您可以使用
#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);
    }
};
它在GCC中失败得很厉害。将
clang
替换为
GCC
,它可以在GCC和clang下干净地编译

在Mac OS X 10.9.2 Mavericks上测试,具有:

  • GCC(
    g++
    )4.8.2
  • Clang(
    Clang
    )“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”