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;//編譯通過
此時枚舉值blue
與int變量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) {
...
}