0%

Generic Selections in C11

看了這篇 C11 - Generic Selections
第一直覺感覺和C++ Template很像,不過也不太一樣。
這是C11的Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
void funci(int x)
{
printf("func value = %d\n", x);
}
void funcc(char c)
{
printf("func char = %c\n", c);
}
void funcdef(double v)
{
printf("Def func's value = %lf\n", v);
}
#define func(X) _Generic((X), int: funci, char: funcc, default: funcdef)(X)
int main()
{
func(1);
func('a');
func(1.3);
return 0;
}

輸出結果是

1
2
3
func value = 1
func value = 97
Def func's value = 1.300000

相似的C++程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
void func(T v)
{
cout << "Def func's value = " << v << endl;
}
template <>
void func<int>(int x)
{
printf("func value = %d\n", x);
}
template <>
void func<char>(char c)
{
printf("func char = %c\n", c);
}

對照結果,對於Character的Match不相同。會Cast成int型態。

1
2
3
func value = 1
func char = a
Def func's value = 1.3

除非寫成這樣

1
func((char)'a');

而文章中不能判斷const/volatile的部份被修改了,行為現在跟C++一樣。
C Community跟C++ Community攜手合作之後,C11跟C++11真多地方相像。