• typecheck()简析


     #define typecheck(type,x) 
     ({ type __dummy; 
    typeof(x) __dummy2; 
     (void)(&__dummy == &__dummy2); 
    1; 
     }) 

    看起来觉得没什么用的代码,其实是检查输入的参数x是不是类型type。

    检测的方法很巧妙,其实就是对比的方法,如果对比呢?
    分别用type的x定义了一个各自的影子变量,由于type本身表示类型,所以用type可以直接定义出一个变量: type __dumy;
    而x是一个变量的名字,需要先获取这个变量多对应的类型,使用typeof获取类型,然后再定义变量。 typeof(x) __dumy2;
    接下来就是对比这两个影子变量了,“&”这个符号是表示获取变量的地址,这里的对比方法是对比这两个变量的地址是否相同,从字面意义上来看对比的 是这两个变量的地址值是否相同,但是,要想完成这个对比首先需要这两个变量是同一个类型的,比如都是int型,或都是char型,否则不同类型的值是不能 对比的,这里正是用了这个特性。至于对比的结果是否相同到不重要,重要的是他们是否属于同一类型,如果是不同的类型GCC就会报错或警告,这样就知道是否 同类型了。至于如果是真的同类型,他们的大小值谁还会在乎呢?  

    #include <stdio.h>
    
    int main()
    {
        int a=2;
        char b='c';
        if(&a==&b)
        {
            printf("can compare
    ");
        }
        else
        {
            printf("can not campare
    ");
        }
        return 0;
    }

    上面的这段代码可以做下测试,编译的时候会报错。

  • 相关阅读:
    Webpack的学习总结(1)
    mybatis-plus逻辑删除
    vscode编译调试C/C++多文件——linux(makefile)
    vscode配置调试C/C++程序——linux环境(命令行编译)
    shell编程题(二十二)
    shell编程题(二十三)
    shell编程题(二十一)
    shell编程题(二十)
    GTK开发视频播放器
    C语言实现LRU缓存(二)
  • 原文地址:https://www.cnblogs.com/cdwodm/p/4385353.html
Copyright © 2020-2023  润新知