// typeof 用来获得一个表达式的类型,但表达式不会被计算
bool typeofDemo(int i)
{
typeof(i) j; // j 的类型是 int
typeof(3 + 6.0) x; // x 的类型为 double
typeof(1)* p; // p 的类型为指向 int 的指针
int[typeof(p)] a; // a 的类型是 int[int*]
writefln("%d", typeof('c').sizeof); // 输出 1
double c = cast(typeof(1.0)) j; // 将 j 强制转换成 double
int n = 1;
typeof(++n) m; // m 被声明为 int,n 不会自增
writefln("%d", n); // 输出 1
typeof(return) b; // 当处于一个函数的作用域内部时,typeof(return) 会产生该函数的返回类型
return true;
}
class A
{
}
class B : A
{
typeof(this) x; // x 被声明为 B 类型
typeof(super) y; // y 被声明为 A 类型
}
struct C
{
typeof(this)* z; // z 被声明为 C* 类型
//typeof(super) q; // 错误,C 没有父级结构
}
bool typeofDemo(int i)
{
typeof(i) j; // j 的类型是 int
typeof(3 + 6.0) x; // x 的类型为 double
typeof(1)* p; // p 的类型为指向 int 的指针
int[typeof(p)] a; // a 的类型是 int[int*]
writefln("%d", typeof('c').sizeof); // 输出 1
double c = cast(typeof(1.0)) j; // 将 j 强制转换成 double
int n = 1;
typeof(++n) m; // m 被声明为 int,n 不会自增
writefln("%d", n); // 输出 1
typeof(return) b; // 当处于一个函数的作用域内部时,typeof(return) 会产生该函数的返回类型
return true;
}
class A
{
}
class B : A
{
typeof(this) x; // x 被声明为 B 类型
typeof(super) y; // y 被声明为 A 类型
}
struct C
{
typeof(this)* z; // z 被声明为 C* 类型
//typeof(super) q; // 错误,C 没有父级结构
}
//typeof(this) r; // 错误,not in a class or struct scope
typeof在协助内嵌表达式的声明时非常有用。这里演示一个如何定义一个安全(在任何情况下,各参数只会被计算一次)的求最大值的宏。
#define max(a,b)
({
typeof (a) _a = (a);
typeof (b) _b = (b);
_a > _b ? _a : _b;
})
让局部变量名以下划线开关的原因是避免与内嵌表达式被使用时传进来的参数名相冲突。我们更希望建立一种新的语法规则,按照这种语法规则,声明的变量的作用域只在该变量初始化之后。相信这会是一种更加可靠的避免冲突的方法。
一些别的使用typeof的例子:
#define pointer(T) typeof (T *)
#define array(T, N) typeof(T [N])
于是声明就可以写成以下形式:
array (pointer (char), 4) y;
因此y的类型就是有四个元素、这些元素指向char类型的指针数组。