C++ 格式化字符串宏

标签 c++ c-preprocessor string-formatting compiler-warnings

我有一个格式化字符串的函数:

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/

相关文章:

c++ - 这段代码中的数组初始化风格是什么?是标准的吗?

c++ - C++ 文件上传/下载库?

c++ - #define for(int z=0;z<2;++z)for(int z=0;z<2;++z)for 中的第三个 'for' 是什么意思

Python numpy 科学记数法限制小数位数

c++ - 无法使用 TBB 和 lambda 编译基本的 C++ 程序

c# - 在 C# 上使用 CreateFile 返回 isInvalid = true

macos - 检测 <Secure/SecRandom.h> 的可用性?

c++ - 可变参数宏 - 可选的初始化表达式

java - 交换网络服务

C++ 遍历 va_list