gpt4 book ai didi

C++ 格式化字符串宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:53 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com