1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
+------------------------------------------------------------------------------+
+ +
+------------------------------------------------------------------------------+
+ C11 _Generic +
+------------------------------------------------------------------------------+
+ +
+------------------------------------------------------------------------------+
+ INDEX +
+------------------------------------------------------------------------------+
1. Intro
2. Examples
2.1. Detect type
2.2. Check if types is compatible
3. Tested
4. Links
5. Files
+------------------------------------------------------------------------------+
+ 1.INTRO +
+------------------------------------------------------------------------------+
In C standard c11 is supported new keyword _Generic. It add way how
we can add at macro level decisions about variable types. And now is
possible make some C++ like function "overloading". Here is some variants how
to use this generic "_Generic". Now could print variables dont looking
on its type _Generic will deal with it.
+------------------------------------------------------------------------------+
+ 2.EXAMPLES +
+------------------------------------------------------------------------------+
2.1.Detect type
#define type_str(T) _Generic( (T), int: "int",\
long: "long",\
default: "Unknown type")
Now we have define check for 2 types int and long. If there is some type
undefined then choose default type and print "Unknown type". This is auto
printf example where you can detect type and print its name. But as in page [1]
you can add number values and compare types in simple way.
printf("Type1 %s\n", type_str('a'));
printf("Type2 %s\n", type_str(1));
printf("Type3 %s\n", type_str(1l));
printf("Type4 %s\n", type_str(0.0f));
Also is possible to use generic for 2 or more types but then amount
of declaration grows. But it means that now according to params
we can choose best function.
#define type_str2(T1,T2) _Generic( (T1),\
int: _Generic((T2),int:"int int", default: "int UNK"),\
default: "UNK UNK" )
printf("Double Type 1 %s\n", type_str2(1,1));
printf("Double Type 2 %s\n", type_str2(1,0.0f));
printf("Double Type 3 %s\n", type_str2(.0f,.0f));
+------------------------------------------------------------------------------+
2.2.Check if types is compatible
Strange but some types could be invalid if there is const used, like
'int' and 'const int'.
#define is_compatible(x,T) _Generic((x), T:"compatible",\
default: "non-compatible")
Here is defined 2 types and only (int and int) and (const int and const int)
is compatible.
int i1;
const int i2;
printf("int == int, %s\n", is_compatible(i1,int));
printf("const int == const int, %s\n", is_compatible(i2,const int));
printf("int == const int, %s\n", is_compatible(i1,const int));
printf("const int == int, %s\n", is_compatible(i2,int));
+------------------------------------------------------------------------------+
+ 3.TESTED +
+------------------------------------------------------------------------------+
gcc-4.9.1
clang-3.4
+------------------------------------------------------------------------------+
+ 4.LINKS +
+------------------------------------------------------------------------------+
[1] http://www.robertgamble.net/2012/01/c11-generic-selections.html
[2] http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29
[3] https://gcc.gnu.org/wiki/C11Status
+------------------------------------------------------------------------------+
+ 5.FILES +
+------------------------------------------------------------------------------+
ex1.c - one argument generic
ex2.c - two argument generic
ex3.c - check for compatibility
>base64 source.tar.gz
H4sIAOKW01MAA+2WT2+bMBiHudafwqKaCpVLbENAStedJu1QqSd6qxRR4mzWiIn4o2Wa9t1nk5FAWZpO
apJOe59DwOZnY8vxg71RmddFKkbW4aCaKBqbK4vGtHttsRj3wyBiPg8CizIaMt/C4wOOaUNdVkmBsTVP
Fs/m9j3/R/Ha9Rcr30sP8w6zwGEY7Fp/RlnwZP1ZMOYWpocZTp//fP3PpUqzeibw+7KaZfLR+/IB9epk
bqrQ+UzMpRJYltM0XyyTSj5mwlmR2MXTT0KJQqaOs3IJjif2NmCTB6QbJnVWTbCtcnXVeeYiNLq8ej0u
R0iqCi8SqRwX/UBnpiTZNTpLc1XqW1Pkurgs9O3csU3Fmpsb85T8Lr0rH5RNnkxVMqIjrttpv+1Wt98U
yI72nGwivV56o9jbC9vRS28se+fCN3MpRFUXCtNr9BOd+r8IHJ+O/9mJ/E9Dyrf+98O1/33w/zH4W/9X
35diWlaF0xU/1iVirKMlr3+N9bNcfdYlc+l/BO7VV5V/U01Hh/8EtHqM9dtYK8PNHC6Si55ETYoPUmyQ
8YeZbBAKBiHq0bmJvSXrdvY/P9X+j0LWOf/x9f6PYP8fg9fefi/1yUAo3IkZiXnfKszV7mi8sj1k6ow5
vUyag1NjG7y1i6m7v7u13b5z7m6bWnw033zMa33QwsYDeOAd7jDSl0o3PhCQibfq+GOLgY64o+OkbfKW
dAMAAAAAAAAAAAAAAAAAAAAAwBH4BYVOCccAKAAA
|