C 11新特性之屬性 Attributes

2021-09-28 12:47:15 字數 1307 閱讀 8964

好像網上關於c++11引入的attributes沒有什麼人進行講解,我在這裡查閱了cppreference,以及微軟的文件,還有一些外網上的教程的例子,如果想看更詳細的解釋可以直接點進去看。(我這裡是稍微翻譯總結了一下上面**上講的內容)

c++11標準定義了一系列的attributes (注:由於國內好像沒有人討論attributes ,我也不知道應該怎麼翻譯,所以本文按屬性來),並且也允許編譯器廠商去定義自己的屬性(在各自的廠商定義的命名空間內),但是編譯器只被要求識別標準裡定義的屬性。

在某些例子裡,標準屬性會與與編譯器特定的declspec關鍵字形似,在vc裡,你可以使用[[deprecated]] 屬性來代替declspec(deprecated),這個行為可以讓所有符合編譯器都識別。對於其他declspec引數,例如dllimport與dllexport, 至今沒有任何屬性與之相等,所以你必須繼續去使用declspec。屬性並不影響型別,並且屬性也不能改變乙個程式的意義。編譯器會忽略他們不認識的屬性

在c++11裡,屬性提供了乙個標準化的方法,去註明c++結構裡(包括但不限於類,函式,變數與**塊)額外的資訊,這個資訊可能是或者不是編譯器廠商特供的。乙個編譯器可以使用這些資訊去生成有用的訊息,或者在編譯**的時候使用特殊的編譯方法。編譯器會忽略任何它不認識的屬性,這就意味著你不可以通過這個語法來定製你自己的屬性,屬性通常由包住

square brackets:

[[deprecated]]

void foo(int);

這些是c++定義的,有部分屬性在c++14,或者17,20中提出,各家廠商的支援成都不同,如果要知道詳細的支援情況,建議查詢官方文件。

[[noreturn]][[carries_dependency]][[deprecated]](c++14)

[[deprecated(「reason」)]](c++14)

[[fallthrough]](c++17)

[[nodiscard]](c++17)

[[maybe_unused]](c++17)

[[likely]](c++20)

[[unlikely]](c++20)

[[no_unique_address]](c++20)

C 11新特性之 nullptr

我們知道在程式設計的世界裡,0有雙重的角色,可以表示整數零,也可以表示乙個空指標。在c語言中,通過預編譯巨集null,可以區分0表示的是零還是 void 0.但是,在c 的世界中,這樣是不可以的。c 中允許函式過載。例如 void foo char void foo int 如果把null定義為0,...

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...

C 11 新特性之 lambda

這是c 11新特性介紹的第三部分,涉及到c 11這次更新中較為重要的lambda表示式。不想看toy code的讀者可以直接拉到文章最後看這部分的總結。熟悉python的程式設計師應該對lambda不陌生。簡單來說,lambda就是乙個匿名的可呼叫 塊。在c 11新標準中,lambda具有如下格式 ...