C++ 如何在字段中存储格式字符串并避免格式非文字警告?
我知道,如果函数需要将格式字符串传递到vsnprintf中,您可以放置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() {
\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(
)4.8.2g++
- Clang(
)“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”Clang
#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(
)4.8.2g++
- Clang(
)“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”Clang
#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(
)4.8.2g++
- Clang(
)“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”Clang
#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(
)4.8.2g++
- Clang(
)“苹果LLVM版本5.1(Clang-503.0.38)(基于LLVM 3.4svn)”Clang