下面我們就來看一下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)
static
void
generictest(
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
struct
mystruct s;
_generic(
"hello"
,
const
char
*:
puts
(
"ok!"
));
// error! "hello"為char[6]型別
_generic(
"hello"
,
char
[6]:
puts
(
"ok!"
));
// ok
_generic((
const
char
*)
"hello"
,
const
char
*:
puts
(
"ok!"
));
// ok
_generic(s,
int
:
puts
(
"ok!"
));
// error
_generic(s,
struct
mystruct:
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位的字元表示。用大括號括起來的列表 初始化列表 的適用範圍,使其可用於所有內建型別和使用者定義的型別。使...