2016-12-03 123 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

你的問題對我來說很遺憾。但我真的不明白,如果這真的是你尋找的答案,爲什麼不接受它?如果沒有,爲什麼不編輯你的文章? –