C11標準的泛型機制

2021-06-17 22:05:56 字數 2587 閱讀 5054

下面我們就來看一下c11標準中的泛型表示式。

c11中的泛型機制由關鍵字_generic引出,其語法形式為:

_generic ( assignment-expression , generic-assoc-list )

generic-assoc-list:

generic-association

generic-assoc-list , generic-association

generic-association:

type-name : assignment-expression

default: assignment-expression 

下面給出c**例子:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#define general_abs(x)  _generic((x), int:abs, float:fabsf, double:fabs)(x)

staticvoidgenerictest(void)

這邊要注意的是,_generic裡的assignment-expression只獲取其型別而不會對它做執行時計算。也就是說,編譯器僅僅在編譯時獲得該表示式的型別,而不會產生任何其它指令。這個跟sizeof()、typeof(),以及c++中的typeid()和decltype()一樣。

另外,generic-association-list中必須要有與assignment-expression型別相同的generic-association,否則編譯會報錯。當然,如果在generic-association-list中含有default處理,那麼編譯能順利進行。如以下**所示:?

12

3

4

5

6

7

structmystruct s;

_generic("hello",constchar*:puts("ok!"));// error! "hello"為char[6]型別

_generic("hello",char[6]:puts("ok!"));// ok

_generic((constchar*)"hello",constchar*:puts("ok!"));// ok

_generic(s,int:puts("ok!"));// error

_generic(s,structmystruct:puts("ok!"));// ok

_generic(s,int:puts("yep!"),default:puts("others"));// ok

c 11標準 泛型演算法

正在看c primer 5,學習的同時,記錄下學習體會。v表示容器 實現在v中統計符合第三個引數條件的數量。有三種方法 bool cmpstr const string s return s.size 5 1 接受乙個一元謂詞。auto count count if v.begin v.end cm...

縱橫C 11標準(目錄)

c 11標準正式通過,正式發布也指日可待,vs和gcc都已經為c 11標準提前做好了部分準備 有些標準仍舊為支援 希望新的標準能夠得到完美的支援 比如c 03標準中的分離模板定義到現在大部分編譯器也沒有很好的支援,export關鍵字也就廢了 個人認為c 11標準中基本原則中的核心是 我根據自己的理解...

C 11新標準總結

c 11新標準出現已久,在此主要對它做乙個總結 c 11新增型別long long和unsigned long long,以支援64位的整型,char16 t,char32 t,以支援16位和32位的字元表示。用大括號括起來的列表 初始化列表 的適用範圍,使其可用於所有內建型別和使用者定義的型別。使...