c++17的注解
C++17提供了三個注解,分別是[[fallthrough]], [[nodiscard]]和[[maybe_unused]]
1.[[fallthrough]]
用於switch-case中,在某個case分支執行完畢之后,如果沒有break語句,則編譯器可能會給出一個警告。但是有時這是開發者有意為之,為了讓編譯器明確知道開發者的意圖,可以在需要某個case分支貫穿的地方(上個case沒有break語句)顯式的設置[[fallthrough]]標記。示例如下:
switch (type)
{
case 1:
func1();
// 這個位置缺少break語句,且沒有fallthrough標注,可能是一個邏輯錯誤,在編譯時編譯器可能會給出警告,以提醒修改
case 2:
func2();
// 這個位置缺少break語句,且有fallthrough標注,是開發者有意為之,在編譯時編譯器不會給出任何警告
case 3:
func3();
}
2.[[nodiscard]]
一般用於修飾函數,告訴函數調用者必須關注函數的返回值(即不能丟棄該函數的返回值)。如果函數的調用者未將該函數的返回值賦值給一個變量,則編譯器給出一個警告。
3.[[unused]]
在通常的情況下,編譯器回懟程序代碼中未使用的函數或者變量給出警告,另一些編譯器直接不允許通過編譯。在C++17之前,為了消除這些未使用的變量帶來的編譯告警或者錯誤,要么修改編譯器的告警選項設置,要么定義一個類似於UNREFERENCED_PARAMETER的宏來顯式調用這些未使用的變量一次,來消除警告或者錯誤:
#define UNREFERENCED_PARAMETER(x) x
int add (int a, int b, int c)
{
UNREFERENCED_PARAMETER(a);
UNREFERENCED_PARAMETER(b);
// 無關代碼省略
}
但是在C++17中,直接使用注解的方式
int add ([[maybe_unused]]int a, [[maybe_unused]]int b, int c)
{
// 無關代碼省略
}