美文网首页
编译时检查sizeof

编译时检查sizeof

作者: 柯蒂斯罗西 | 来源:发表于2018-07-08 21:46 被阅读0次

需求:在编译时检查struct数据结构的大小

思路a:预编译时检测,不一定支持sizeof,且数据结构类型未知。

思路b:运行时检测,效率问题。

思路c:在编译时检测。


编译时检测

Linux内核(在include/linux/kernel.h)里面已经有相关的macro解决这个问题。

#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

我们可以改装此宏定义:

#define BUILD_BUG_ON(condition) ((void)sizeof(char[condition? 1:-1])) 

具体的原理是:(void)1,这个语句即使使用了 -Wall的编译参数,也不会有警告;

因此,BUILD_BUIG_ON这个宏展开后等效于

(void)sizeof(char[1])

(void)sizeof(char[-1])

相关文章

  • 编译时检查sizeof

    需求:在编译时检查struct数据结构的大小 思路a:预编译时检测,不一定支持sizeof,且数据结构类型未知。 ...

  • sizeof

    sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计...

  • CPP_Basic_Summary_0.4

    CPP_Basic_Summary_0.4 1、编译器不会检查数组下标是否有效2、sizeof用于数组名,则计算整...

  • OC底层实现_准备知识_03

    (一)使用sizeof获取基础变量需要内存空间大小 打印结果如下: Note:sizeof是编译时一元运算符,是在...

  • 实例对象,类对象,元类对象的存储

    int a = 10;sizeof(a) -> 4byte。 sizeof是运算符,在编译的时候通过类型计...

  • iOS7----64位与32位 对比 数据类型

    可用如sizeof(char),sizeof(char*)等得出 32位编译器 char :1个字节 char*(...

  • sizeof

    1.sizeof是一个运算符,不是函数2.sizeof不能求得void类型的长度,即sizeof(void)编译器...

  • 编译时检查器

    下载地址:git@github.com[mailto::git@github.com]:stormzsl/Name...

  • 32位和64位系统区别及字节数

    常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char...

  • 数据类型字节大小

    常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char...

网友评论

      本文标题:编译时检查sizeof

      本文链接:https://www.haomeiwen.com/subject/iicauftx.html