若何写一个C法式,要求里面不带#include?

刚刚阅读1回复0
kanwenda
kanwenda
  • 管理员
  • 注册排名1
  • 经验值172380
  • 级别管理员
  • 主题34476
  • 回复0
楼主

在PDP合做开发中,不免牵扯到非常多的象征位处置,不但是玩电脑系统、零售版合做开发的老友,好比说跟许多组件彼此共同初步设想会碰着形形色色讯号与否安妥、获得胜利之类情况,而那些讯号多半都是bool类别,1个bit方可展开标识表记标帜。

当然,假设现实上是几个象征,间接拿个uint8_t的医美来展开标识表记标帜也不会影响什么,但假设不但多的话或许就较为废RAM了。不外,为的是更快的办理工做那些象征位等,有个如下表右图三种形式供各人更快的办理工做那些象征位 :

1

绝对途径间接标识表记标帜

接纳绝对途径是办理工做那些象征位较为间接且便利快速的形式,标识表记标帜符如下表右图右图:

1typedef union _tag_SystemFlag 2{ 3 uint16_t all; 4 struct 5 { 6 uint16_t Run :1; 7 uint16_t Alarm :1; 8 uint16_t Online :1; 9 uint16_t TimerOver :1; 10 uint16_t Reserver :12; 11 }bit; 12 13} uSystemFlag; 14 15uSystemFlag unSystemFlag; 16 17int main(int argc, char *argv[]) { 18 19 unSystemFlag.all = 0x00; //系统象征去除 20 21 unSystemFlag.bit.Run = 1; //置位 22 unSystemFlag.bit.Alarm = 1; 23 unSystemFlag.bit.Online = 1; 24 unSystemFlag.bit.TimerOver = 1; 25 26 unSystemFlag.bit.Run = 0; //应缴 27 unSystemFlag.bit.Alarm = 0; 28 unSystemFlag.bit.Online = 0; 29 unSystemFlag.bit.TimerOver = 0; 30 31 return 0; 32}

那些象征位的操做体例不过乎就是置位、应缴,以及加载四种形式。

但如标识表记标帜符中如许的操做体例形式在句子或语法抒发上仍是不如简单。

我时常谈及,标识表记标帜符能够不写注解,不外你的每一表达式、表达式中文名称等需要足够多的简单,所以良多老友生活习惯把那些象征PCB起来。

该文上方附自学天然资本,自助式申领。

3年PDP物联网自学天然资本从头整理撷取:C词汇、Linux合做开发、计算机流程;软件合做开发,STM32电脑系统、ARM硬体合做开发、物联网通信合做开发、综合性项目合做开发讲义数据材料;测验复试专业课。点选上方应用流程完全免费申领↓↓↓

点选申领​s.pdb2.com/l/CMIsoKcnATFIF4M

2

隐式+位移

为的是更快的抒发一般会对象征位展开进一步的PCB,如下表右图标识表记标帜符右图:

1typedef enum _tag_Flag { 2cEmRun = 0, 3cEmAlarm, 4cEmOnline, 5cEmTimerOver 6}emSystemFlag; 7 8uint16_t SystemFlag ; 9//置位 10void SetFlag(emSystemFlag flag) 11{ 12 SystemFlag |= ((uint16_t)0x01) << flag; 13} 14//去除 15void ClrFlag(emSystemFlag flag) 16{ 17 SystemFlag &= ~(((uint16_t)0x01) << flag); 18} 19//获得情况 20uint8_t GetFlag(emSystemFlag flag) 21{ 22 return (((SystemFlag & (((uint16_t)0x01) << flag)) != 0)? true:false); 23} 24 25int main(int argc, char *argv[]) { 26 27 SetFlag(cEmAlarm); 28 29 if(GetFlag(cEmAlarm) == true) 30 { 31 printf("ClrFlag\r\n"); 32 ClrFlag(cEmAlarm); 33 } 34 else 35 { 36 printf("SetFlag\r\n"); 37 SetFlag(cEmAlarm); 38 } 39 return 0; 40}

当然,PCB成表达式是相对较为耗时的,不外标识表记标帜符也会愈加的易懂,假设确实容忍不了表达式PCB带来的时间消耗,把表达式修改为宏标识表记标帜符片段或者内敛表达式(前提是编译器撑持)也是可行的。

3

宏列表

或许那里才是本文的重中之重~

以前跟各人介绍过,用宏主动化的生成形形色色标识表记标帜符片段,以使得标识表记标帜符愈加的紧凑。当然可读性会相对降低一点,但关于反复性标识表记标帜符就不需要太多考虑了。

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef unsigned char uint8_t; 5typedef unsigned int uint16_t; 6typedef signed char int8_t; 7typedef int int16_t; 8 9#define true 1 10#define false 0 11 12 13//宏列表 14#define TAG_LIST(tag) \ 15tag(Run)\ 16tag(Alarm)\ 17tag(Online)\ 18tag(TimerOver) 19 20 21//隐式处置 22#define DEFINE_TAG(_tag) _tag, 23enum Flag { 24None = 0, 25TAG_LIST(DEFINE_TAG) 26EmMAX 27}; 28#undef DEFINE_TAG 29 30//位定义表达式 31uint16_t SysFlag = 0x0000; 32 33 34//通用办法定义 35uint8_t GetFlags(uint16_t mask) 36{ 37 return ((SysFlag & mask) != 0)? true:false; 38} 39 40void SetFlags(uint16_t mask) 41{ 42 SysFlag |= mask; 43} 44 45void ClrFlags(uint16_t mask) 46{ 47 SysFlag &= ~mask; 48} 49 50 51//主动生成三类表达式定义 52#define FLAG_Operater(flag) \ 53uint8_t get##flag() {\ 54return GetFlags(1 << flag);\ 55}\ 56void set##flag() {\ 57SetFlags(1 << flag);\ 58}\ 59void clr##flag() {\ 60ClrFlags(1 << flag);\ 61} 62 63//反向表达式联系关系 64TAG_LIST(FLAG_Operater) 65 66int main(int argc, char *argv[]) { 67 68 setRun(); 69 setAlarm(); 70 71 if(getAlarm() == true) 72 { 73 printf("set \r\n"); 74 } 75 else 76 { 77 printf("clr \r\n"); 78 } 79 80 return 0; 81}

假设以前有过类似标识表记标帜符处置的老友,应该看那段标识表记标帜符仍是较为轻松的吧,假设有点陌生,能够一层一层展开领会。

其次要的功用是,通过宏替代和标识表记标帜符拼接符号,主动的生成通用的标识表记标帜符片段。如许做的益处是,不再需要我们在标识表记标帜符中定义一大堆setflag、clrflag、getflag等表达式。

通过上面的标识表记标帜符当我们向TAGLIST宏中添加一个标识表记标帜符,方可生成一系列相关的操做体例表达式等。

如许一方面能够及简化标识表记标帜符,同时也能制止许多人工编码带来的错误。

原文链接:https://mp.weixin.电话.com/s/Kl0Sq6WRU-LkCvMo9eVfcA

转载自:PDPARM

原文链接:教你3种办理工做C流程中象征位的办法

本文来源收集,完全免费传达常识,版权归原做者所有。如牵扯做品版权问题,请联络我展开删除。

0
回帖 返回旅游

若何写一个C法式,要求里面不带#include? 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息