2015-05-22 42 views
4

我試圖將[[deprecated]]屬性引入我的代碼庫。然而,並非我需要支持的所有編譯器都支持這種語法(標準化之前由不同編譯器使用的各種方法在attribute standardization proposal N2761中描述)。因此,我試圖在這個屬性條件編譯,使用__has_cpp_attribute類似於宏函數首先,如果是可用的,就像這樣:__has_cpp_attribute不是'類似功能'的宏嗎?

#if defined(__has_cpp_attribute) && __has_cpp_attribute(deprecated) 
    #define DEPRECATED(msg) [[deprecated(msg)]] 
#elif OTHER_COMPILER 
    // ... 
#endif 

然而,這個編譯我使用gcc version 4.9.2 (GCC)當我收到錯誤,命令行gcc -std=c++14 cpp.cpp

cpp.cpp:1:56: error: missing binary operator before token "(" 
#if defined(__has_cpp_attribute) && __has_cpp_attribute(deprecated) 

這個錯誤似乎表明__has_cpp_attribute定義,但它不是一個宏功能。有條件地編譯gcc中的[[deprecated]]屬性的正確方法是什麼?

+0

@Columbo不是bug。 –

+0

@ T.C。哦,它沒有功能測試宏? – Columbo

+1

@Columbo我在gcc 5.1發行說明中看到:http://www.gnu.org/software/gcc/gcc-5/changes.html,它說'__has_cpp_attribute'被添加;所以我認爲它在此之前不存在。 – MuertoExcobito

回答

8

GCC 4.9沒有__has_cpp_attribute,並且&&的短路行爲沒有擴展到允許無效構造遵循它。

也就是說,如果沒有定義foo

#if defined(foo) && foo(bar) 

無效。

你想要的是

#if defined(__has_cpp_attribute) 
    #if __has_cpp_attribute(deprecated) 
     #define DEPRECATED(msg) [[deprecated(msg)]] 
    #endif 
#elif OTHER_COMPILER 
    // ... 
#endif 

因此使用__has_cpp_attribute的條件是,如果沒有定義__has_cpp_attribute被跳過一組。 (在跳過的組中,預處理指令只能通過指令的名稱進行處理;其餘的令牌將被忽略。)

相關問題