[英]Trying to use __attribute__ in a #define macro to support MSVC and G++, having compile issues
在我的項目中,我有一個 function ,其行為類似於sprintf
,如果格式字符串中存在參數不匹配,我想啟用編譯器警告。 我知道這在 MSVC 中是不可能的,但是因為我的項目是用 MSVC 和 G++ 編譯的,所以我想實現一個獨立於平台的宏,將必要的 __attribute__ 添加到 Z3CD270942B7B02F3400 上的 function 中。 為了實現這一點,我寫了這個宏:
#if WIN32
#define ATTR_PRINTF_CHECK(formatIndex, firstParamIndex)
#else
#define ATTR_PRINTF_CHECK(formatIndex, firstParamIndex) \
__attribute__ ((format (printf, formatIndex, firstParamIndex)))
#endif
如果編譯器是 MSVC (Win32),那么這應該評估為空。 如果是 G++,則應將其替換為__attribute__
說明符。 但是,當我嘗試編譯以下 function 時,兩個編譯器都失敗了:
void Log(CLogSeverity _severity, const char *format, ...) ATTR_PRINTF_CHECK(3, 4);
在 linux (G++) 上,編譯器會說以下內容:(是的,“預期”之后的那些確切字符)
logger.h:39:61: error: expected ‘;’ at end of member declaration
void Log(CLogSeverity _severity, const char *format, ...) ATTR_PRINTF_CHECK(3, 4);
如果我在 MSVC 上編譯,它會給我這個錯誤:
error C3646: 'ATTR_PRINTF_CHECK': unknown override specifier
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2059: syntax error: '('
// and a bunch of other garbage
我是否誤解了#define
宏在 C/C++ 中的工作方式? 我是否不允許使用它們來插入特定於編譯器的屬性?
我找到了這個問題的原因。 我的ATTR_PRINTF_CHECK
宏是在不同的 header 文件中定義的,該文件顯然不包含在當前的 header 中。 因此,兩個編譯器都試圖將宏解釋為特殊屬性。
我沒有早點弄清楚這一點的原因是因為我的 IDE (CLion) 沒有警告我該宏不存在,甚至將其突出顯示為有效的宏,以及智能感知和 ctrl 單擊導航。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.