在C++里又关键字auto,可以自动推导出表达式的类型;从写法上来看,C++的auto更为方便。其实这些个变量(表达式)的类型编译器是知道的,就是怎么根据当前变量的类型定义一个新的变量,具有相同的类型。实现的功能都是一样的。
C++里的auto;
C里的typeof,GCC提供的__auto_type;
都是完成这一功能的关键字。
这个和auto的作用完全一致,就应用来说是实现了使用统一的方式。而且使用__auto_type相对于typeof的优势是:
#define atomic_store_explicit(PTR, VAL, MO) \
__extension__ \
({ \
__auto_type __atomic_store_ptr = (PTR); \
//这里是重新创建一个PTR类型的变量
__typeof__ (*__atomic_store_ptr) __atomic_store_tmp = (VAL); \
//这里是将指针解引用,就是类型的原始类型,然后创建临时变量
__atomic_store (__atomic_store_ptr, &__atomic_store_tmp, (MO)); \
//最后使用到这个新键的指针变量,及临时变量做操作。
})
上面这个例子,明显还是用到了typeof的宏;只是对于ansi标准或者其他std标准,里面没有typeof关键字。所以在使用GNU C扩展功能时,可能会出现一些问题。或者一般性目的的头文件,需要兼容这些标准的程序。但是asm, typeof和inline不可用,所以只能使用替换方案,这就是__typeof__出现的原因。
问题出来了,这里为什么两个都是用到了?有什么特殊的原因吗?
这个使用上略显麻烦。
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
https://mzhan017.blog.csdn.net/article/details/128415988
这个和C++的auto类似,都有关键字auto,用法也类似。
#define max(a,b) \
({ __auto_type _a = (a); \
__auto_type _b = (b); \
_a > _b ? _a : _b; })
自动类型推导。
/* Are two types/vars the same type (ignoring qualifiers)? */
#ifndef __same_type
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
#endif