簡體   English   中英

嘗試在#define 宏中使用 __attribute__ 來支持 MSVC 和 G++,但存在編譯問題

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

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