C语言常用宏定义技巧 z

C语言宏定义详解 详解C语言的宏定义,用例子让大家会用,避免问题 阅读详情

1、防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
 //头文件内容
#endif
2、重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef  unsigned char      boolean;     /* Boolean value type. */

typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */

typedef  unsigned short     uint16;      /* Unsigned 16 bit value */

typedef  unsigned char      uint8;       /* Unsigned 8  bit value */

typedef  signed long int    int32;       /* Signed 32 bit value */

typedef  signed short       int16;       /* Signed 16 bit value */

typedef  signed char        int8;        /* Signed 8  bit value */

//下面的不建议使用
typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */

typedef  unsigned short    word;         /* Unsinged 16 bit value type. */

typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */

typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */

typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */

typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */

typedef  signed char       int1;         /* Signed 8  bit value type. */

typedef  signed short      int2;         /* Signed 16 bit value type. */

typedef  long int          int4;         /* Signed 32 bit value type. */

typedef  signed long       sint31;       /* Signed 32 bit value */

typedef  signed short      sint15;       /* Signed 16 bit value */

typedef  signed char       sint7;        /* Signed 8  bit value */

3、得到指定地址上的一个字节或字
#define  MEM_B( x )  ( *( (byte *) (x) ) )

#define  MEM_W( x )  ( *( (word *) (x) ) )

4、求最大值和最小值
   #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

   #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5、得到一个field在结构体(struct)中的偏移量
#define FPOS( type, field ) /

/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6、得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7、按照LSB格式把两个字节转化为一个Word
#define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8、按照LSB格式把一个Word转化为两个字节
#define  FLOPW( ray, val ) /

  (ray)[0] = ((val) / 256); /

  (ray)[1] = ((val) & 0xFF)

9、得到一个变量的地址(word宽度)
#define  B_PTR( var )  ( (byte *) (void *) &(var) )

#define  W_PTR( var )  ( (word *) (void *) &(var) )

10、得到一个字的高位和低位字节
#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

11、返回一个比X大的最接近的8的倍数
#define RND8( x )       ((((x) + 7) / 8 ) * 8 )

12、将一个字母转换为大写
#define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13、判断字符是不是10进值的数字
#define  DECCHK( c ) ((c) >= '0' && (c) <= '9')

14、判断字符是不是16进值的数字
#define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||/

                       ((c) >= 'A' && (c) <= 'F') ||/

((c) >= 'a' && (c) <= 'f') )

15、防止溢出的一个方法
#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

16、返回数组元素的个数
#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

17、返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) /

           ( (dword)(val) & (dword)((mod_by)-1) )

18、对于IO空间映射在存储空间的结构,输入输出处理
  #define inp(port)         (*((volatile byte *) (port)))

  #define inpw(port)        (*((volatile word *) (port)))

  #define inpdw(port)       (*((volatile dword *)(port)))

  #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))

  #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val)))

  #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
19、使用一些宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
C++中还定义了 __cplusplus

如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。

__LINE__ 及 __FILE__ 宏指示,#line指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。

__DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
__TIME__ 宏指令包含程序编译的时间。时间用字符串表示,其形式为: 分:秒
__STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。
__cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。与标准c++不一致的编译器将使用具有5位或更少的数值。


可以定义宏,例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
 

20、宏定义防止错误使用小括号包含。
例如:
有问题的定义:#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}
应该使用的定义: #difne DO(a,b) do{a+b;a++;}while(0)
例如:
if(addr)
    DUMP_WRITE(addr,nr);
else
    do_somethong_else();
宏展开以后变成这样:
if(addr)
    {memcpy(bufp,addr,nr); bufp += nr;};
else
    do_something_else();

gcc在碰到else前面的“;”时就认为if语句已经结束,因而后面的else不在if语句中。而采用do{} while(0)的定义,在任何情况下都没有问题。而改为 #difne DO(a,b) do{a+b;a++;}while(0) 的定义则在任何情况下都不会出错。

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Linux C高阶(14)C语言宏定义你所不知道的事 微信公众号:二进制人生 专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。 更新日期:2020/1/24,内容整理自网络,转载请注明出处。 文章目录规避语法错误什么时候使用宏定义 规避语法错误 众所周知,C语言支持宏定义,并且功能强大。举个例子: #include <stdio.h> #define swap(a,b) {int t=a;a=b;b=t;} int main() { int x = 1, y = 2; swap(x, y); pri. 阅读详情

相关推荐

Vim 入门到够用:Linux 文本编辑器的三种模式、常用操作与实战技巧

i 进入编辑模式Esc 退出编辑模式回到命令模式: 从命令模式进入底行模式编辑,不一定非得“打开就直接打字”。一旦你接受了“模式”这件事,后面很多操作都会顺起来。学 Vim,不要追求一次学全,先把“命令模式—编辑模式—底行模式”这条主线练熟。只要这条主线通了,后面的复制、删除、搜索、替换,都是顺手补上去的能力。

Web安全工具库 802

C语言常用宏定义技巧(转)

1、防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H //头文件内容#endif2、重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int  ui

thewayma的专栏 823

别急着做AI:FDE教你识别真需求,让AI真正落地

人工智能项目在落地过程中,经常出现业务方高喊“我们要做AI”,却说不清具体应用场景的现象。判断一个需求是否值得用AI实现,不能只看技术流行度,而要从问题出现频率、当前替代方案以及可量化业务价值三个维度展开验证。同时需要冷静比较规则引擎与大模型的边界:不是所有语义任务都要靠生成式模型,稳定、可解释且低成本的传统方案往往更具工程性价比。数据闭环也至关重要,缺乏历史样本与反馈回流路径的项目,很难在真实环境中持续优化。针对智能客服、合同审查或企业知识库等典型场景,可借助人机协同与最小代价的用户验证,逐步筛除伪需求,

weixin_42624889的博客 342

C语言 宏定义限制大小 及限制范围

C语言 宏定义限制大小 及限制范围 #define MaxLimit(a,max) ((a)>(max)?(max):(a)) #define MinLimit(a,min) ((a)<(min)?(min):(a)) #define LIMIT_VAL(a,min,max) ((a)<(min)?(min):((a)>(max)?(max):(a)))

eydj2008的专栏 3225

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7372

使用光流进行 Warp 的流程

光流描述了图像帧中每个像素的运动。前向光流:描述了帧中每个像素在帧中的移动位置。后向光流:描述了帧中每个像素在帧​ 中的移动位置。水平方向的位移(x 方向),即每个像素水平移动了多少像素。垂直方向的位移(y 方向),即每个像素垂直移动了多少像素。使用光流进行 Warp 的流程Warp 是通过光流对图像进行变换的操作,旨在将前一帧的像素根据光流场映射到下一帧的对应位置。Step 1: 计算光流我们首先需要通过光流网络(如 RAFT)来估算两帧之间的光流。我们可以获得前向光流(从帧​ 到帧。

qq_44199605的博客 2108

如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

C语言中宏定义使用的小细节#pragma#pragma 预处理指令详解在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为: #P...

weixin_28871097的博客 1212

第六节 旅烨cms实战练习 -2021.03.11

第六节 旅烨cms实战练习 -2021.03.11 前期使用win10里小皮搭建旅烨cms,以为自己的各项配置有问题,但是小皮能够正常带动DVWA,始终带动不了旅烨cms。 后来与其他安全人员交流,发现win7可以正常运行旅烨cms。 所以目前为何出现问题尚不清楚 1.环境搭建 win7+小皮 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOSTEFUw-1615475228402)(C:\Users\LuXian\AppData\Roaming\Typora\typora

lyx3429的博客 574

Daily-C-Study(15):C语言宏定义#define

Daily-C-Study(15):C语言宏定义#define 成于坚持,败于止步 一、数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎。它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了;也可以把任何东西定义成宏。因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙。看例子:

Seal--学海无涯 5976

2 君正底层API接口的封装1

君正的IPC芯片主要有T31、T40、T41等型号,每个型号的API接口大部分是相同的,但也存在一些不一致和差异化的地方。为了屏蔽不同芯片型号之间的差异,我们需要基于一个公共基类进行封装。在封装之前,我们需要定义自己的错误码和数据结构,用于屏蔽不同君正芯片的实现细节。为了确保整个IPC库使用统一的错误码,我们在HP_MPPErrorCode.h文件中专门定义了以下错误码。错误码囊括了参数错误、内存错误、溢出错误、不支持、密码错误、非法数据等各种异常情况。

hope_wisdom的技术博客 1591

【OD统一考试(B卷)】比赛的冠亚季军,Python 解答

比赛的规则是 0 号和 1 号比赛,2 号和 3 号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮,实力值大的获胜,实力值相等的情况,id 小的情况下获胜,轮空的直接进入下一轮。第一轮比赛,id 为 0 实力值为 2 的运动员和 id 为 1 实力值为 3 的运动员比赛, 1 号胜出进入下一轮争夺冠亚军,id 为 2 的运动员和 id 为 3 的运动员比赛,3 号胜出进入下一轮争夺冠亚军;2 号与 0 号,比赛进行季军的争夺,2 号实力值为 4,0 号实力值 2,故 2 号胜出,得季军。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

【C语言】变量/常量/宏定义,数据类型以及取值范围

变量和常量是程序处理的两种基本数据对象 变量 变量的意义就是确定目标并提供存放的空间。 变量的命名规则 1.变量名只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线 _ 组成。 2.第一个字母必须是字母或者下划线开头。 3.变量名区分大小写。 4.不能使用关键字来命名。 -关键字列表 基本数据类型 1.char -字符型,占用一个字节。 2.int -整型,通常反映了所用机器语言中整数的...

JL_xcly的博客 4506

微信小程序 - 最新详细实现气泡菜单功能,点击任意元素在底部或附近周围弹出气泡菜单列表,仿微信气泡弹框显示菜单快捷功能收纳,自定义气泡弹窗/菜单气泡弹窗,小程序气泡框嵌套菜单组件插件,自动计算弹出定位

微信小程序,vue2,vue3,气泡列表,汽泡菜单,气泡框,泡泡框,悬浮框,悬浮菜单,点击菜单按钮弹出气泡,对话箭头气泡框,弹出的气泡准确定位并吸附在附近,弹出式气泡,弹窗菜单,气泡自定义HTML弹窗,带三角的气泡弹框,三角气泡框里面嵌套菜单,当点击一个按钮或元素时,会从附近弹出一个小气泡一样的菜单列表,自定义气泡框内的内容,点击一个元素在附近弹出一个气泡弹框功能效果,气泡弹框不准怎么办,被盖住了,挡住了,长按弹出,组件插件,微信,自定义气泡菜单组件,气泡弹出框,小程序自定义气泡框,菜单气泡,包裹列表的三角

🏆 前端领域优质创作者 3922

【C语言学习】宏定义大揭秘:C语言中的预处理器魔法,你get到了几个技巧?

在C语言编程中,预处理器是一个强大的工具,可以在编译之前对源代码进行一系列的文本替换和处理。其中,宏定义是最常用的功能之一。通过宏定义,我们可以简化代码、提高可读性和维护性。今天,我们就来揭开宏定义的神秘面纱,带你一步步走进这个充满魔力的世界。准备好了吗?让我们开始吧!宏定义是一种在编译前对源代码进行文本替换的技术。C语言中的宏定义通常使用#define指令来实现。宏定义可以分为两种类型:对象宏和函数宏。宏定义虽然强大,但也有一些需要注意的地方。下面通过一些具体的例子来说明宏定义的使用技巧。

java专栏 2015

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

c语言中宏定义的字符替换#define M(x,y,z) x*y+z

C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdlib.h> //写入system("pause");用到的头文件 #define M(x,y,z) x*y+z void main() { int a=1,b=2,c=3; printf("%...

darry的博客 8600

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言 常量和宏定义

C语言:常量和宏定义什么是常量常量的类型定义符号常量(宏定义)标识符是什么字符串常量代码 什么是常量 在程序运行时,值不能被改变的量,称之为常量。 常量的类型 整型常量:520,1314,123 实型常量:3.14,10.15,6.66 字符常量 - 普通字符:‘H’,‘i’,‘p’,‘s’ - 转义字符:‘\n’,‘\t’,‘\b’ 字符串常量:“FishC” 符号常量:使用之前必须先定义 定义符号常量(宏定义) 格式:#define 标识符 常量 比如: - #define NAME “Emine

jnydep的博客 3875

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c语言比较xy最大值和最小值,C语言常用宏定义技巧

6C语言常用宏定义技巧用C语言编程,宏定义是个很重要的编程技巧。用好了宏定义,它可以增强程序的可读性、可移植性、方便性、灵活性等等。1.防止一个头文件被重复包含:#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif当你所建的工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏定义就能够避免同一个头文件被重复包含时进行多次编译。因...

weixin_39755824的博客 791

C语言常用宏定义技巧

C语言常用宏定义技巧用C语言编程,宏定义是个很重要的编程技巧。用好了宏定义,它可以增强程序的可读性、可移植性、方便性、灵活性等等。 1. 防止一个头文件被重复包含:  #ifndef COMDEF_H  #define COMDEF_H //头文件内容  #endif 当你所建的工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏定义就能够避免同一个头文件被

键盘的起始页 1947

C语言宏定义作用、使用方法小结

宏广泛用于C语言程序中,本文总结了宏的分类, 作用与使用注意事项   宏定义分类:   (1)不带参数的宏定义   形式: #define 宏名 [宏体] 功能:可以实现用宏体代替宏名 使用实例: #define TRUE 1 作用:程序中多次使用TRUE,如果需要对TRUE的值进行修改,只需改动一处就可以了     (2)带

zhao67865的专栏 5443

C语言中宏定义和函数的区别

前言 在C语言中,对于一些常用或通用的代码段的封装可以有两种方式:函数和宏定义。 这篇博客就来带大家梳理一下对于这两种方式我们在使用时应该如何抉择,以及它们的区别和优缺点。 宏定义和函数的区别 从程序的执行来看: 函数调用需要开辟和释放栈空间带来开销(压栈、释放),不仅会降低代码效率,而且代码量也会大大增加。 宏定义只在编译前进行,不分配空间,不占运行时间。 总结:宏定义在代码规模和速度方面都比函数更胜一筹 从参数的类型来看: 函数的参数必须声明为一种特定的数据类型,如果参数的类型不同,就需要使用不

Outtch_的博客 1794

C语言宏定义用法总结

前言最近在看源代码与开发项目的时候经常会遇到一些特殊的宏用户,接接触时感觉有点奇怪,其实是自己没有全面的熟悉宏的用法。在查阅完相关的材料后,写下这一篇总结,以期待以后忘记的时候可以重新打开回忆起里面的内容来。本博文主要是总结#define的用法,包括定义符号与定义宏macro。预处理器的作用编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段。C预处理器在源代码编译之前对其进行一

jmhIcoding 1万+

【C语言】用(#define)宏定义表达式写出加法、交换函数

#define宏 1. 用宏定义表达式完成加法运算函数 #define ADD(x,y) ((x)+(y)) 宏会替换到调用宏函数的地方,这是毋庸置疑的。 为什么x+y的整体要加上() ? 那么为什么参数x,y要加上() ? 我们来结合代码看一下吧。 #define ADD(x,y) x+y int main() { int x1 = 3; int x2 = 5; printf("%d\n...

进阶之路 1万+

C语言宏定义、宏替换

1.宏替换的格式 #define 名字 替换文本 后续所有出现名字的地方都将被替换为替换文本。 替换文本可以是任意的,例如 #define forever for(;;) //无限循环 该语句为无限循环定义了一个新名字。 2.带参数的宏定义 宏定义可以带参数,这样可以对不同的宏调用使用不同的替换文本。例如,下列宏定义了一个宏max: #define max(A,B) (A>B?A:B) 再例如,下列宏定义了一个可交换两个变量值的宏swap(参数t为数据类型): #define swap(

Dontla的博客 5261

C语言的奇技淫巧(1-50)

01. 宏定义用do{}while(0) 如果定义的宏函数后面有多条语句,使用这样的方式会有问题: #define FUNC() func1(); func2() if(bRunF) FUNC(); 展开宏定义后会变成: if(bRunF) func1(); func2(); 逻辑就不对了。可以用这一的方式解决,非常好用: #define FUNC() do{func1(); func2();}while(0) 02. 数组的初始化 假如给arr的第2~6元素初始化为5,也

嵌入式软件实战派 1万+

关于C语言刷题(#define宏定义函数的常见错误)

关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种。分为无参宏定义和带参宏定义。无参宏定义的一般形式为:#define 宏名 字符串;带参宏定义的一般形式为:#define 宏名(参数表) 字符串; 其实#define不仅可以定义常见变量,也可以定义带参函数 在使用中一定要注意#define的边界问题(可以简单理...

九分先生的博客 3527

C语言中的宏定义(#define)用法及特殊符号技巧

定义常量1000// 预编译时替换为 1000#define PI3.14159# define MAX 1000 // 预编译时替换为 1000 # define PI 3.14159 // 替换圆周率 ‍``` ‍```注意事项:宏名通常用大写,‍```c # define MAX 1000 // 预编译时替换为 1000 # define PI 3.14159 // 替换圆周率 ‍``` ‍```注意事项:宏名通常用大写,避免与变量冲突 [ 1 ]() [ 7 ]()。

探索技术、创意与生活的交汇点,分享个人成长与思考,带你发现生活中的美好与智慧 1023
上一篇: 整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题 z
下一篇: 算法合集 z
KataDoc360
博客等级 码龄18年 65粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值