typeof

// 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 没有父级结构
}

//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类型的指针数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值