GUN C提供了一不少扩展(参考C-Extensions),其中就包括了typeof(),其作用类似于C++11 里的 decltype 操作符,可以取得变量或表达式的类型。
几个比较有意思的使用typeof()的方式:
1、用于定义函数指针类型的变量
int func(int a);
typeof(func)* func_ptr;
2、通过typeof()定义用于接收函数返回值的变量
int func(int a);
typeof(func(0)) b;
b = func(0);
3、实现安全的max、min宏(linux-2.6.7 内核源码中就有这样的使用方式)
#define min(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
#define max(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x > _y ? _x : _y; })
同时在使用时也必须要注意其使用上的一些限制和注意项:
- typeof构造中的类型名不允许包含存储类说明符(extern、static)、允许包含类型限定符(const、volatile)。
- typeof是gnu c的扩展,标准c并不包含该关键字,所以编译时需要选定gnu 标准(如:-std=gnu90)进行编译。
- 通常如果要兼容标准c,就要用__typeof__
- 通常能用typedef的地方就可用typeof