C语言结构体位段特性实现断言宏

关于位段的特性这里就不多说了,多去看看相应的C语言书籍都会有介绍了。

今天来介绍断言宏。什么是断言宏?断言宏可以认为是校验数据范围的有效性的一个宏的实现。我们来看看代码:

#include <stdio.h>
//结构体位段
#define      CHECK(x)           sizeof(struct {unsigned:(-!!(x));})
//检查常量是否在一定范围之内,如果不在范围之内,则编译报错
//比如定义一个0到1000的范围,如果传入的xxx小于0或者大于1000,则编译器发现会报错
#define      DEFI(a , xxx)      a = CHECK(xxx<0) + CHECK(xxx>1000) + xxx
int main(void)
{
	int a ;
	DEFI(a , 2000) ;
	printf("a:%d \n" , a);
	return 0 ;
}

运行结果:

编译报错,因为2000不0~1000的范围内:

如果我们改成一个合法的数据范围,比如改成1000,我们来看看结果:

#include <stdio.h>
//结构体位段
#define      CHECK(x)           sizeof(struct {unsigned:(-!!(x));})
//检查常量是否在一定范围之内,如果不在范围之内,则编译报错
//比如定义一个0到1000的范围,如果传入的xxx小于0或者大于1000,则编译器会发现报错
#define      DEFI(a , xxx)      a = CHECK(xxx<0) + CHECK(xxx>1000) + xxx
int main(void)
{
	int a ;
	DEFI(a , 1000) ;
	printf("a:%d \n" , a);
	return 0 ;
}

运行结果:

这种方式可以用在嵌入式项目的开发上,提醒自己时刻注意数据类型的范围,我觉得这是一种非常好的编程辅助检查手段。

时间: 2024-10-30 22:06:52

C语言结构体位段特性实现断言宏的相关文章

结构体 赋值 初始化-C语言结构体循环赋值老是出现随机数。。

问题描述 C语言结构体循环赋值老是出现随机数.. 问题是这样的 本人大一 C语言课程设计 做一个运动员管理系统 部分代码如下 #include #include #include #include void search(); void enter(); void browse(); void save(); void add(); int load(int y); int exchange(int x); void Department(); void sex(); void project(

c语言 结构体函数:PHP的语言结构和函数的区别

相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等.例子: if ( isset($user) ) { //do some thing }原因是isset是语言结构,而strlen是一个函数.还有echo 是个语言结构,不是个函数.那什么是语言结构呢?它和函数有什么不同吗?1. 什么是语言结构和函数语言结构:就是PHP语言的关键词,语言语法的一部分:它不可以被用户定义或者添加到语言扩展或者库中:它可以有也可以没有变量和返回值.函

MySQL 4.1.0 中文参考手册 -- 6.1 语言结构

mysql|参考|参考手册|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6 MySQL 语言参考 MySQL 拥有一个复杂的但直观易学的 SQL 接口.这个章节描述了各种不同的命令.类型和函数,为了高效地使用 MySQL 需要了解它们.这个章节也可以视为 MySQL 中包含的所有功能的参考. 6.1 语言结构6.1.1 文字:怎么写字符串与数字 这个章节描述了在 MySQL

malloc-c语言结构体问题 关于内存分配问题

问题描述 c语言结构体问题 关于内存分配问题 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<math.h> #include<string.h> #define MAX 100 #define LEN sizeof(struct book) typedef struct book { char id[20]; char name[30]; float price

struct-关于C语言结构体指针数组的问题

问题描述 关于C语言结构体指针数组的问题 //结构体struct student{ int iNum; char cName[16]; float fChineseScore; float fMathScore; float fEnglishScore;};typedef struct student STUDENT;//输入void InputTranscript(STUDENT MyClass[] int num){ int i; printf(""请输入学生的成绩信息:n&quo

c语言-C语言结构体的指针问题。

问题描述 C语言结构体的指针问题. struct GenInfo { uint64_t (*next)(struct GenInfo * const); enum GeneratorType type; union { struct GenInfo_Constant constant; struct GenInfo_Counter counter; struct GenInfo_Discrete discrete; struct GenInfo_Exponential exponential;

struct-C语言结构体变量指针问题,求助

问题描述 C语言结构体变量指针问题,求助 #include #include #include #define N 10 typedef struct { char name[10]; double price; struct { int year;int month;int day ;}date; }STREC; int fun(STREC a,double p) { int i,j=0; double q; for(i=0; i < N ; i++,a++) { q=a->price; i

2017年ACL的四个NLP深度学习趋势 (一):语言结构和词汇嵌入(Linguistic Structure and Word Embeddings)

更多深度文章,请关注:https://yq.aliyun.com/cloud 介绍 在本月初我在温哥华出席的ACL(国际计算语言学协会 (ACL,The Association for Computational Linguistics) )时Joakim Nivre宣布:"NLP正在蓬勃发展".参加人数众多的人士认为,学术界对NLP的兴趣已经处于历史最高点,主要是因为深度学习的成功. 然而,我参加ACL时注意到的一个研究人员的焦虑,因为一个领域正在快速发展转型.研究人员对是否将旧的N

Go语言结构体定义和使用方法_Golang

本文实例讲述了Go语言结构体定义和使用方法.分享给大家供大家参考.具体分析如下: 一个结构体(struct)就是一个字段的集合. (而 type 定义跟其字面意思相符.) 复制代码 代码如下: package main import "fmt" type Vertex struct {     X int     Y int } func main() {     fmt.Println(Vertex{1, 2}) } 结构体字段使用点号来访问. 复制代码 代码如下: package