首页 > 其他分享 >c实现编译时检测结构体大小

c实现编译时检测结构体大小

时间:2024-10-14 11:22:41浏览次数:6  
标签:__ 检测 ASSERT 编译 STATIC 大小 COND define

静态断言(_Static_assert)是在C11标准中引入的,它允许在编译时检查某些条件是否为真。如果条件为假,则编译器会报错。

通过下面这段代码的目的是兼容C11标准之前的编译器,它定义了一个宏STATIC_ASSERT,用来在编译时检查条件COND是否为真。如果COND为假,则编译器会报错,错误信息为MSG

 

#if (__STDC_VERSION__ >= 201112L) // 如果是c11 标准
#define STATIC_ASSERT(COND, MSG) _Static_assert(COND, MSG)
#else // 如果是 c11 标准之前的,例如c99,c89
// 连接标记并生成唯一标识符的宏
// 实现方式是将一个基本名称与当前行号结合起来。
#define TOKENPASTE(x, y) x##y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE_STATIC_ASSERT_ID TOKENPASTE2(_static_assertion_, __LINE__)

// 旧编译器的自定义静态断言实现
// 这会生成具有唯一标识符的typedef。
// 如果条件为false,它会尝试创建一个大小为-1的数组,这将导致编译时错误。
#define STATIC_ASSERT(COND, MSG) \
    typedef char __attribute__((unused)) UNIQUE_STATIC_ASSERT_ID[(COND) ? 1 : -1]
#endif // (__STDC_VERSION__ >= 201112L)

 

例子:

我有一个结构体,编译时实现对大小的检测等

typedef struct {
    u32 data[4];
} __attribute__((packed)) test;

STATIC_ASSERT((sizeof(test) == 8), "test structure size is not 8byte!");

 

标签:__,检测,ASSERT,编译,STATIC,大小,COND,define
From: https://www.cnblogs.com/zjxcyr/p/18463701

相关文章

  • yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
    多目标追踪+实例分割+目标检测YOLO(YouOnlyLookOnce)是一个流行的目标检测算法,它能够在图像中准确地定位和识别多个物体。本项目是基于YOLO算法的目标跟踪系统,它将YOLO的目标检测功能与目标跟踪技术相结合,实现了实时的多目标跟踪。在目标追踪+语义分割+目标检......
  • 基于CNN的雨雾天气下车辆检测和颜色识别系统
    –引言:开篇简述图像处理在智能交通监控、自动驾驶等领域的关键作用,并强调随着深度学习尤其是卷积神经网络(CNN)的发展,在复杂环境下的车辆颜色精确识别、图像恢复(如去雾和去雨)等难题得以有效解决。yolo改进像去雨去雾技术对目标检测的改进精度具有显著作用,原因如下:提高图......
  • 基于YOLOv8的道路缺陷检测系统设计(代码+教程+pyqt)
    路面裂缝检测是计算机视觉在基础设施维护中的一个重要应用。使用YOLOv8进行路面裂缝检测的过程与绝缘子检测类似,包括数据准备、模型训练和部署。下面是一个详细的流程,包括代码示例。YOLOv8是YouOnlyLookOnce(YOLO)系列目标检测算法的最新版本,它以其快速和准确的目标......
  • 【蓝队】Sysmon识别检测宏病毒
    原创玄影实验室权说安全前言在不断变化的网络安全环境中,提前防范威胁是非常重要的。本文将以MicrosoftOffice宏病毒钓鱼为例,介绍如何使用Sysmon来获取和分析Windows系统日志,揭示隐藏的恶意或异常活动,了解入侵者和恶意软件如何在网络上运行。SysmonSysmon(系统监视......
  • linux kernel编译
    编译x86的kernelexportARCH=x86_64exportCROSS_COMPILE=x86_64-linux-gnu-makedefconfigmake-j32中间出现了libelf.h找不到,sudoapt-getinstalllibelf-devbc解决。编译aarch64的kernelexportARCH=x86_64exportCROSS_COMPILE=x86_64-linux-gnu-makedefconfig......
  • sqlite 源码编译,并写一个 sqlite_demo程序。
    环境介绍:ubuntu系统cmake(cmake安装) (可以手动下载源码,编译安装,也可以使用系统最新的cmake安装)  一、下载源码并编译https://github.com/sqlite/sqlite/tree/vesion-3.45.1下载3.45.1的源码 sqlite-vesion-3.45.1.zip 解压 sqlite-vesion-3.45.1到当前目......
  • 《OpenCV计算机视觉》—— 人脸检测
    文章目录一、人脸检测流程介绍二、用于人脸检测的关键方法1.加载分类器(cv2.CascadeClassifier())2.检测图像中的人脸(cv2.CascadeClassifier.detectMultiscale())三、代码实现一、人脸检测流程介绍下面是一张含有多个人脸的图片第一步:读取图片后将图片转换成灰度图第......
  • 如何使用shell脚本检测磁盘使用率?
    在Linux系统中,使用shell脚本检测磁盘使用率是一种常见的任务。以下是一些基本步骤和示例脚本,帮助你实现这一功能。1.使用 df 命令df 命令是查看文件系统磁盘空间使用情况的标准工具。你可以使用它来获取磁盘使用率的百分比。2.编写脚本以下是一个简单的shell脚本示例,用于......
  • 数据处理和分析之数据预处理:异常值处理(Outlier Detection):统计学方法检测异常值
    数据处理和分析之数据预处理:异常值处理(OutlierDetection):统计学方法检测异常值异常值的概念与重要性异常值的定义在数据集中,异常值(Outliers)指的是那些显著偏离其他观测值的数值。这些数值可能由于测量错误、数据录入错误、实验异常或其他非典型因素产生。异常值的存在......
  • 数据处理和分析之数据预处理:异常值处理(Outlier Detection):基于密度的异常值检测方法
    数据处理和分析之数据预处理:异常值处理(OutlierDetection):基于密度的异常值检测方法数据处理和分析之数据预处理:异常值处理(OutlierDetection):基于密度的异常值检测方法引言异常值检测的重要性在数据科学和机器学习领域,异常值检测是数据预处理中的一个关键步骤。异......