簡體   English   中英

在 C++ 中抑制類似 printf 的警告 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM