2016-12-03 96 views
2

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

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", ""); 

警告显示在模板函数,不在呼叫现场。

是否可以在呼叫站点显示格式警告,而不是在模板化功能中显示?

+1

你代码没有阐明你的意思,“警告显示在模板化功能中,而不是在呼叫现场”。 [mcve]需要。 –

+0

当调用sprintf时,格式函数内部会生成警告。该错误应显示在呼叫站点 - 即调用格式功能时。当我在format()函数中得到警告并且函数有100个调用者时,很难找出错误源自的地方。 –

回答

0

我想出了一个解决方案来解决我的问题。 如果编译器为该格式生成警告,则警告显示在宏被调用的行处。

我检测了两个模板格式功能和下面的宏: 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*/() 
+0

在C++中使用宏进行元编程?你确定吗? –

+0

你有任何其他解决方案的问题? –

+0

你的问题对我来说很遗憾。但我真的不明白,如果这真的是你寻找的答案,为什么不接受它?如果没有,为什么不编辑你的文章? –