搜索
bottom↓
回复: 9

定义一结构体,如果尺寸超标时、编译要告警,该怎么做?

[复制链接]

出5入14汤圆

发表于 2022-5-27 21:43:19 | 显示全部楼层 |阅读模式
本帖最后由 EMC菜鸟 于 2022-5-27 21:44 编辑

如下:
        typedef        struct
        {
                float f_Kva;
                float f_Kvb;
                float f_Kvc;
                float f_Kia;
                float f_Kib;
                float f_Kic;
        }DEVICE_PARA;

#if        sizeof( DEVICE_PARA ) > 18
        #warning "结构体尺寸超标!"
#endif

编译通不过!怎么做才能在结构体尺寸不对时编译器告警?(在程序里实现的不算)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出40入45汤圆

发表于 2022-5-27 21:52:50 | 显示全部楼层
18 改成 24 就可以了

出0入76汤圆

发表于 2022-5-27 21:56:55 来自手机 | 显示全部楼层
记得可以的啊,不行的话你在头文件里定义一个无用的空函数,里面定义这个结构体变量,再进行预处理判断报错。

出0入25汤圆

发表于 2022-5-27 23:32:58 | 显示全部楼层
本帖最后由 XIVN1987 于 2022-5-27 23:39 编辑

根据下面这个帖子里的说法,#if的条件不能包含sizeof

https://stackoverflow.com/questions/4079243/how-can-i-use-sizeof-in-a-preprocessor-macro

如果编译器版本大于等于C11,可以使用 _Static_assert:_Static_assert(sizeof(DEVICE_PARA) == 24, "size is not correct");

如果编译器版本小于C11,那就只能自己定义个宏,,比如tinyusb里面是这么搞的

  1. #define TU_STRCAT(a, b)       a##b                ///< concat without expand
  2. #define TU_XSTRCAT(a, b)      TU_STRCAT(a, b)     ///< expand then concat

  3. // Compile-time Assert
  4. #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
  5.   #define TU_VERIFY_STATIC   _Static_assert
  6. #else
  7.   #define TU_VERIFY_STATIC(const_expr, _mess) enum { TU_XSTRCAT(_verify_static_, __LINE__) = 1/(!!(const_expr)) }
  8. #endif

  9. TU_VERIFY_STATIC(sizeof(DEVICE_PARA) == 24, "size is not correct");
复制代码

出15入178汤圆

发表于 2022-5-28 00:12:09 | 显示全部楼层
可以参考GCC的示例:

  1. #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
  2. BUILD_BUG_ON(sizeof(DEVICE_PARA) > 18);
复制代码

出5入14汤圆

 楼主| 发表于 2022-5-28 11:06:09 | 显示全部楼层
本帖最后由 EMC菜鸟 于 2022-5-28 11:07 编辑
XIVN1987 发表于 2022-5-27 23:32
根据下面这个帖子里的说法,#if的条件不能包含sizeof

https://stackoverflow.com/questions/4079243/how-c ...
(引用自4楼)


试了一下,第二个好使,谢谢!

不过看不懂,高手能指点一下么?

出0入25汤圆

发表于 2022-5-28 18:08:50 | 显示全部楼层
EMC菜鸟 发表于 2022-5-28 11:06
试了一下,第二个好使,谢谢!

不过看不懂,高手能指点一下么?
(引用自6楼)


展开后是:enum { _verify_static_11 = 1/(sizeof(DEVICE_PARA) == 24) }

如果条件成立,等号右边就是 1/1
如果条件不成立,等号右边就是 1/0,这样就会编译报错

11 是 “TU_VERIFY_STATIC(sizeof(DEVICE_PARA) == 24, "size is not correct");”这行代码在文件中所在的行的行号

出5入14汤圆

 楼主| 发表于 2022-5-28 20:01:46 | 显示全部楼层
XIVN1987 发表于 2022-5-28 18:08
展开后是:enum { _verify_static_11 = 1/(sizeof(DEVICE_PARA) == 24) }

如果条件成立,等号右边就是  ...
(引用自7楼)

谢谢,我慢慢的消化一下

出0入0汤圆

发表于 2022-5-28 20:32:33 | 显示全部楼层
板凳, 听高手讲课了。

出0入8汤圆

发表于 2022-5-30 13:58:29 | 显示全部楼层
定义一个数组, char  _temp[18- sizeof( DEVICE_PARA )];   如果超过会提示报错,但是最大会浪费18个字节的内存
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 20:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表