C23 屬性([ [deprecated] ]、[ [fallthrough] ]、[ [nodiscard] ])
/ AT-rib-yoots /
有時你想為函式、變數或敘述附上一則「編譯器」能理解的註記——『這已過時,使用時請警告』、『忽略這個回傳值很可能是錯誤』、『是的,這個 case 真的是刻意往下落入下一個』。C23 採納了一種標準語法來表達這些註記,借自 C++:寫在雙中括號內、置於它所套用之物旁的屬性。
三個常見的:函式上的 deprecated 屬性會讓編譯器在該函式被使用時發出警告(可附訊息),方便從舊 API 遷移。函式上的 nodiscard 屬性會讓編譯器在呼叫者忽略回傳值時發出警告,對於結果必須被檢查的函式(如配置或錯誤碼)很有價值。fallthrough 屬性是一個你放在 switch 中、表示某個 case 刻意落入下一個的敘述,告訴編譯器缺少的 break 是故意的,因而抑制落穿警告。另外兩個 maybe_unused 與 noreturn 補齊了標準集合。因為屬性設計成可忽略,不認識某屬性的編譯器可以略過它而不報錯。
它們對程式碼健康很重要:抓出被忽略的錯誤碼、引導使用者離開棄用函式、並記錄刻意的 switch 落穿,讓審查者與工具都同意那是故意的。提醒:屬性通常產生「警告」而非硬性錯誤,所以它的益處取決於你以開啟警告的方式編譯(例如 gcc -Wall)並真的去讀它們。
[ [deprecated("use new_open")]] int old_open(const char *p); [ [nodiscard]] int parse(const char *s); // 結果被忽略時警告 switch (c) { case 'a': handle_a(); [ [fallthrough]]; // 缺少的 break 是刻意的 case 'b': handle_b(); break; }
標準的 C23 屬性讓編譯器對棄用使用、被忽略的回傳值發出警告,並認可刻意的 switch 落穿。
屬性通常發出警告而非硬性錯誤,且不認識的屬性可能被無聲忽略——所以它們只有在你開啟警告編譯並去讀它們時才有幫助。