C++注解標簽(attributes)


C++注解標簽(attributes)

早在C++98/03時代,不同的編譯器用不同的注解偽代碼添加一些額外的說明,比如#param, __declspec, __attribute。然而,不同的編譯器可能對於同一個功能有不同的注解,這就需要我們為不同的編譯器寫不同的代碼。
好在從C++11開始,我們有了統一制定的注解標簽,極大的方便了編程。

enumeration和enumerator

光看上面兩個詞就已經讓人困惑了,從英語語法角度,是不是一個指物體,一個指人呢。。。舉兩個例子就很容易理解了

//enumeration的例子
enum Color {
    red,
    green,
    blue
};
int blue = 0xff; //編譯不通過

這是因為一旦定義了枚舉,在他的作用域內就不能定義同名的變量。
再來一個enumerator的例子:

enum class Color {
    red,
    green,
    blue
};
int blue = 0xff;//編譯通過

此時枚舉值blueint變量blue不會沖突,如果想要引用枚舉blue,需要用Color::blue的形式引用。

[[noreturn]]

C++11引入了[[noreturn]],該注解意思是告訴編譯器,該函數沒有返回值。比如

[[noreturn]] void func();

[[deprecated]]

終於不用羡慕Java了,C++14引入了[[deprecated]]表示某個函數已經過時了,當使用這些過時的函數時,編譯器會給出警告。

[[deprecated]]void func();

如果要給出提示信息,可以這樣寫:

[[deprecated("func is deprecated! use funcA instead")]]void func();

[[fallthrough]]

C++17新加了[[fallthrough]]注解,用於switch-case語句,當某個case沒有break時,有的編譯器會給出警告。我們可以在這個case后面加上[[fallthrough]]表示我們是故意不加break的。

switch(type) {
case 1:
    ...
    //這里沒加break,編譯器可能會給警告
case 2:
    ...
    [[fallthrough]];
    //這里加了[[fallthrough]],告訴編譯器這么做是有意為之
case 3:
    ...    
}

[[nodiscard]]

[[nodiscard]]用於修飾函數,告訴調用者一旦調用了這個函數,必須將返回值賦給一個變量,否則編譯器給出警告。在C++20中,operator new()std::allocate等庫函數都使用了[[nodiscard]],強調必須是使用這些函數的返回值。

[[maybe_unused]]

有時候我們使用某個函數時,其中某些變量並沒有使用,這時候編譯器會給出警告,為了消除警告,可以使用[[maybe_unused]]注釋告訴編譯器,這些變量可能會沒被用到。

int func(int arg1, [[maybe_unused]] int arg2) {
    ...
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM