Я знаю, что этот вопрос, возможно, был задан раньше, но не ответил на запрос, который я публикую ниже. Я пытаюсь понять, почему именно код ниже дает ошибку (и в другой версии GCC, предупреждение) и esp. как это решить? Я опытный программист на C++, но иногда вам нужно искать помощи. Любая помощь приветствуется.snprintf: тот же код - разные ошибки/предупреждения для разных компиляторов g ++
[ERROR]: не может передать объекты нетривиально-Copyable типа «класс станд :: basic_string» через
/// USE THE MACRO BELOW TO LOG A FORMATTED STRING (usage is exactly like printf(...) [ SEE HEADER FILE - TEMPLATE FUNCTION user_log_fmt(...) ]
#define LOG_TRACE_FMT(...) Logger::getInstance()->user_log_fmt(LOG_LEVEL_TRACE, __PRETTY_FUNCTION__, __FUNCTION__, __VA_ARGS__)
void main()
{
std::string linkName = getLinkName();
// THIS IS THE CALL THAT LEADS TO THE ERROR AT COMPILE-TIME
LOG_TRACE_FMT("\nLink-name: %s, Sent packet: SYS: %d, COMP: %d, LEN: %d, MSG ID: %d\n", linkName, msg->sysid, msg->compid, msg->len, msg->msgid);
}
///
/// Part of logger class (combines strings with argument for formatting)
///
template <typename ... Args>
void user_log_fmt(LOG_LEVEL level, std::string pretty_func, std::string func_name, std::string str_format, Args ... args)
{
if (m_LogLevel < level)
return;
std::string formatted_data = utils::Utils::string_format(str_format, args...);
// Do something with the formatted string..
}
///
/// Part of Utils library. This method does a printf type formatting.
///
template<typename ... Args>
static std::string string_format(const std::string& format, Args ... args)
{
size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
std::unique_ptr<char[]> buf(new char[ size ]);
snprintf(buf.get(), size, format.c_str(), args ...);
return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}
Ошибка находится с snprintf заявлении выше.
WARNING on g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609:
предупреждение: формат не строковые и никаких аргументов в формате [-Wformat-безопасности] size_t размера = snprintf (nullptr, 0, format.c_str(), арг ...) + 1;» ^
ERROR on g++ (Raspbian 4.9.2-10) 4.9.2
ошибка: не может передать объекты нетривиально-Copyable типа 'класс станд :: basic_string' через '...' size_t размер = snprintf (nullptr, 0, format.c_str(), args ...) + 1;
Note: I wish to understand and resolve this but without providing a compiler flag setting. I understand this may have something to do with C compatibility with C++.
Спасибо!
@SouravGhosh Спасибо за указание. Но snprintf относится к C, поэтому я отметил его как C. Содержимое хранится как c-строка. – Sammy
Кажется, что работает с онлайн-компилятором C++ 14: http://ideone.com/HfuHIx. Как вы называете эту функцию? – mch
@Sammy Это хорошо, но IMHO этот вопрос ищет ответы на основе языка C++, а C и C++ - не то же самое. –