[英]Suppressing warnings for a printf-like function in C++
我在 C 中有一個類似於 function 的傳統日志記錄 printf:
namespace legacy
{
void DoLog(const char* format,...);
}
如果僅在定義了相應的宏時才可見(這也是遺留的):
#ifdef LOG
# define Log legacy::DoLog
#else
# define Log /* Nothing */
#endif
我有一些 C++ 代碼,它調用此日志如下:
Log("Logging started!");
當未定義LOG
宏時, Log("Something");
變成("Something");
這是未使用的代碼。
我需要在 GCC 中抑制這些警告,並且只執行一次,當然,所以我將Log
包裝到MyLog
中作為#define MyLog Log
並嘗試這個:
#define MyLog(...) \
_Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Wunused-value\""); \
Log(__VA_ARGS__); \
_Pragma("GCC diagnostic pop");
但是由於某種原因這些編譯指示沒有任何效果
https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
我最好使用帶有模板的內聯 C++ 包裝器來進行完美包裝,但我還無法應對......
有什么建議如何抑制這些警告?
先感謝您!
利用
#define Log(...)
然后Log("Logging started;");
擴展到;
而不是("Logging started;");
我設法得出以下兩個解決方案:
C++ 樣式內聯 function,使用抑制警告和基本 Windows 和 Linux 平台定義:
template<typename... Args>
inline void MyLog(const char* format, Args... args)
{
#ifndef LOG
# ifdef _MSC_VER // Windows
# pragma warning(push)
# pragma warning(disable: 4548)
# elif defined(__GNUC__) // Linux
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wunused-value"
# endif
#endif
Log(format, (args,...));
#ifndef LOG
# ifdef _MSC_VER // Windows
# pragma warning(pop)
# elif defined(__GNUC__) // Linux
# pragma GCC diagnostic pop
# endif
#endif
}
C 樣式包裝器宏,即使不需要任何警告抑制(感謝@KamilCuk 和@user253751):
#ifndef LOG
# define MyLog(...)
#else
# define MyLog(...) Log(__VA_ARGS__)
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.