我有一个格式化字符串的函数:
template<typename ... Args>
inline std::string format(const std::string & format, Args ... args)
{
std::size_t size = MINIGINE_FORMAT_PRINTF(nullptr, 0, format.c_str(), args ...) + 1; // +1 for NULL terminated
std::unique_ptr<char[]> buf( new char[ size ] );
MINIGINE_FORMAT_PRINTF(buf.get(), size, format.c_str(), args ...);
return std::string(buf.get(), buf.get() + size - 1); // -1 we don't want NULL terminated
}
问题是当我调用这个函数时:
format("%d", "");
警告显示在模板函数中,而不是调用位置。
是否可以在调用站点而不是模板函数中显示格式警告?
最佳答案
我想出了一个解决我的问题的方法。 如果编译器针对该格式生成警告,则该警告将显示在调用宏的行中。
我已经在下面测试了模板格式函数和宏: https://godbolt.org/ 当模板函数的格式参数是 const char* 而不是 std::string
时,它们似乎都生成相同的代码#pragma once
#include <string>
#include <memory>
#ifdef _MSC_VER
#define MINIGINE_FORMAT_PRINTF _snprintf
#else
#define MINIGINE_FORMAT_PRINTF snprintf
#endif
#define MINIGINE_FORMAT(format, ...) \
/*Capture everything by reference*/[&] /*No arguments*/() \
{ \
std::size_t size = MINIGINE_FORMAT_PRINTF(nullptr, 0, format, __VA_ARGS__) + 1; \
std::unique_ptr<char[]> buf( new char[ size ] ); \
MINIGINE_FORMAT_PRINTF(buf.get(), size, format, __VA_ARGS__); \
return std::string(buf.get(), buf.get() + size - 1); \
} /*Call the lambda*/()
关于C++ 格式化字符串宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946062/