zoukankan      html  css  js  c++  java
  • Linux typeof【转】

    转自:http://blog.csdn.net/xiaofeng_yan/article/details/5248633

    今天偶然又看到了typeof这个东西,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在Linux中用的非常多, 这里大概叙述了typeof是一个什么东西,怎么用,实际上可以用简单的话来重述。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp.)返回的是exp.的数据类型大小,那么typeof(exp.)返回的就是exp.的数据类型。值得注意的是在上面的话里我们可以看到,如果编译选项中指定了使用标准C,那么gcc的扩展使用可能会受到影响,不过在gcc编译条件下使用__typeof__依然可以正常工作,这和使用asm是一样的。当然如果是在其他的编译器条件下,这样做也不行了,只能自定义一个macro去使用,也就是说跟gcc没啥关系了,你愿意把typeof咋实现都可以。
    
    下面写一个小程序示例一下:)
    
    #include <stdio.h>
    
    typedef struct
    {
     int x;
     char y;
    }astruct, * pastrcut;
    
    int main()
    {
     int sizem, sizew;
     int x = 3;
     typeof(&x) m;
     sizem = sizeof(m);
     *m = 5;
     typeof(((astruct *)5)->y) w;
     sizew = sizeof(w);
     w = ''a'';
     return 1;
    }
    
    首先看main函数里的m变量,这个变量的类型就是typeof(&x), 由于x是int型的(这里与x是否被赋值一点关系都没有)所以&x应该是int *类型,那么typeof(&x)返回的类型就是int*,所以m自然也就是个int*类型的。之后我们看w变量,其类型是 typeof(((astruct *)8)->y), 其中astruct是一个被定义的结构类型,其中的y元素是char*类型,那么((astruct *)8)->y是啥意思呢?在这里0并不是真正的变量,可以把它理解为一个替代使用的符号当然这个符号最好是一个数,其意思更可以理解为一个被赋值了的变量,这个数可以不是0,3也可以8也可以,随便什么都可以。那么((astruct *)0)->y仅仅就是表示了y这个变量,所以typeof的结果就是y元素的类型,也就是char。
    
    下面是函数类型的情况
    
    #include <stdio.h>
    int funa (int a)
    {
            a=2;
            return a;
    }
    __typeof(funa) test_funa __attribute((alias("funa"), visibility("default")));
    int main ()
    {
            int b;
            b = test_funa(b);
            printf("b = %d",b);
    }
    test_funa 是funa()的别名。
    
    
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fpmystar/archive/2009/02/23/3929085.aspx
  • 相关阅读:
    Mysql开启日志
    amfphp传递负数的bug
    linux /var/spool/clientmqueue 目录占大量空间
    WinXP SSH连接不上虚拟机的解决方法
    批量数据替换助手V1.0版发布
    也谈反射的应用场景
    反射+特性打造简洁的AJAX调用
    文本处理之利器正则表达式闪亮登场
    关于缩略图的生成与访问策略的一些经验分享
    装饰模式个人的一些理解
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/7229383.html
Copyright © 2011-2022 走看看