C语言中被常用到的宏
不管用什么语言编写程序,都会用到一些灵活的、简约的风格来实现简单的应用。C语言(当然也包括其他语种),设计良好的宏定义,不但可以使代码易懂耐用,而且也能大幅度提升自己对语言的掌控和应用能力,使得“面前的”代码量更少,实现的功能却不随之减少。不过,必须有度和并且具备极强的掌控力。
1、防止头文件被重复包含(写代码必须注意也是最基本的一点)
1 #ifndef _HEADER_FILE_H_ 2 #define _HEADER_FILE_H_ 3 4 /* Some contents of your header file */ 5 6 #endif
2、使用C++编译器编译C程序
在Linux下,不只有使用C语言编程的可能,也存在使用C++编程的时候,那么当C++工程中内嵌C(可能是推翻之前的C工程的决心不够,或者其他)的时候,关联C编译器会是比较好的选择。只需要在现在的C++工程头文件中包含下面的构建,即可:
#ifndef _HEADER_FILE_H_ #define _HEADER_FILE_H_ #ifdef __cplusplus__ extern "C"{ #endif /* Some contents of your header file */ #ifdef __cplusplus__ } #endif #endif
3、获取指定内存地址的内容
1 #define MEM_B(x) (*((byte *)(x))) //获取指定内存地址的一个字节 2 #define MEM_W(x) (*((word *)(x))) //获取指定内存地址的一个字
4、指定结构体中特定域的偏移量
1 #define FPOS(type,field) ((dword)&((type *)0)->field)
5、指定结构体中特定域的占用字节
1 #define FSIZE(type, field) sizeof(((type *)0)->field)
6、取指定变量的地址
1 #define B_PTR(var) ((byte *)(void *)&(var)) 2 #define W_PTR(var) ((word *)(void *)&(var))
7、避免在自增运算中造成溢出的可能
1 #define INC_SAT(val) (val=((val)+1 > (val)) ? (val)+1 : (val))
8、字母的大小写转换
1 #define UPCASE(c) (((c)>='a' && (c)<='z') ? ((c)-0x20) : (c)) 2 #define UPCASE(c) (((c)>='a' && (c)<='z') ? ((c)-0x20) : (c))
9、计算数组元素的个数
1 #define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
10、进制检测
1 #define DECCHECK(c) ((c)>='0' && (c)<='1') //二进制检测 2 #define DECCHECK(c) ((c)>='0' && (c)<='7') //八进制检测 3 #define DECCHECK(c) ((c)>='0' && (c)<='9') //十进制检测 4 #define HEXCHECK(hex) (((hex)>='0' &&(hex)<='9')||((hex)>='A' && (hex)<='F')||((hex)>='a' && (hex)<='f')) //十六进制检测
11、使用特定宏的跟踪调试
1 __LINE__ //程序运行所在的行号 2 __FILE__ //程序运行所在的文件名 3 __DATE__ //程序运行时间:月、日、年 4 __TIME__ //程序运行时间:时、分、秒 5 __FUNC__ //程序运行所在的函数体 6 /* printf("Function %s, Line %d in File %s\n", __FUNC__, __LINE__, __FILE); */
12、“#”和“##”的用法
12.1 记录文件名
1 #define _GET_FILE_NAME(f) #f 2 #define GET_FILE_NAME(f) _GET_FILE_NAME(f) 3 4 static char FILE_NAME[] = GET_FILE_NAME(__FILE__); 5 /* 成功后,可获得当前运行文件的文件名 */
12.2 结构填充
1 #define FILL(a) {a, #a} 2 3 enum IDD{OPEN, CLOSE}; 4 typedef struct MSG{ 5 IDD id; 6 const char * msg; 7 }MSG; 8 9 MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; 10 11 /* 成功后,MSG msg[] = {{OPEN,"OPEN"},{CLOSE,"CLOSE"}}; */
12.3 分配一个数值串形式大小的存储空间
1 #define _TYPE_BUF_SIZE(type) sizeof #type 2 #define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type) 3 4 char buf[TYPE_BUF_SIZE(INT_MAX)]; 5 /* INT_MAX,在<climit.h>中定义,大小是:0x7FFFFFFF,成功后,可获得:buf[11]的空间。 */
13、最大值和最小值
1 #define MAX(x, y) (((x) > (y)) ? (x) : (y)) 2 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
14、按照LSB存储形式进行类型互转
C语言中被常用到的宏相关推荐
- Java语言中的常用包、访问控制
Java常用的语言包 Java的核心类都放在Java包以及其子包下,Java扩展的许多类都放在Javax包以及其子包下.这些实用类也就是前面所说的API(应用程序接口),Oracle按这些类的功能分别 ...
- C语言中的常用库宏--持续更新
c语言中的宏/持续更新 limits.h 名字 值 说明 CHAR_BIT 8 定义了一个字节中的比特数 SCHAR_MIN -127 定义最小值签署的字符 SCHAR_MAX 127 定义最大值签署 ...
- c语言中一些常用的逻辑运算,C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...
- C语言中最常用标准库
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limi ...
- C语言中最常用标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- 关于C语言中一些常用函数的说明
1.I/O函数 (1)scanf函数: int scanf(const char *format-..); 从标准输入流stdin中按格式format将数据写到参数表中;若操作成功,返回写到参数表中的 ...
- linux编译时开启宏,【spec】Linux上编译安装的spec文件中的常用路径以及宏变量
我们在Linux上利用 rpmbuild 构建 rpm 安装包时,通过命令rpm --showrc 查看实现代码,另外直接通过 rpm --eval "%{macro}"来查看具体 ...
- C语言中的常用循环语句
在C语言中,我们所熟悉的循环语句有for循环.while循环和do- while循环语句.下面依次展示语句用法: (1)for循环语句 for(初始化部分:条件判断部分:调整部分) { 循环语句: } ...
- c语言中的常用函数的使用,C语言的常用库函数使用方法分析及用途
absread()读磁盘绝对扇区函数 原形:int absread(int drive,int num,int sectnum,void *buf) 功能:从drive指定的驱动器磁盘上,sectnu ...
最新文章
- 7年增长16倍,清华AI+ML课程学生数暴增 | AI Index 2018
- 无人车、超级高铁、智慧城市......这是一份来自未来的出行报告
- 2010年南非世界杯乌拉圭和韩国八强赛观后感
- java监听变量的变化_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
- Memcache工作原理总结
- solaris 10 安装oracle 10g
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- JavaScript中九九乘法表制作
- 【JavaWeb】XML和Jsoup的相关内容
- shell下的常用语句
- 阿里云windows server 2012安装.net framework3.5失败解决方案
- 我在美团的八年,技术人必读
- 中国邮政支付宝卡通开通流程
- 010,spring boot 文件上传
- 测试移动信号频率的软件,移动设备的FM测试
- Python-snap7 安装和测试
- 数学建模英文论文写作
- tolua unity 报错_关于LUA+Unity开发_toLua篇【二】
- 一文读懂配置管理(CM)
- 不删除其他盘的文件情况下扩充C盘空间
热门文章
- 在DevExpress中使用CameraControl控件进行摄像头图像采集
- android 程序安装路径选择
- 文件打包成zip类型文件
- 细数人体十大最“无用”的器官。
- 【PHP 每日函数】第 03 周期
- V4L2开发要点【转】
- 简易django项目之登录验证
- GET和POST到底啥区别???
- eclipse如何修改dynamic web module version
- linux c 报错 warning: large integer implicitly truncated to unsigned type[-Woverflow]