不管用什么语言编写程序,都会用到一些灵活的、简约的风格来实现简单的应用。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语言中被常用到的宏相关推荐

  1. Java语言中的常用包、访问控制

    Java常用的语言包 Java的核心类都放在Java包以及其子包下,Java扩展的许多类都放在Javax包以及其子包下.这些实用类也就是前面所说的API(应用程序接口),Oracle按这些类的功能分别 ...

  2. C语言中的常用库宏--持续更新

    c语言中的宏/持续更新 limits.h 名字 值 说明 CHAR_BIT 8 定义了一个字节中的比特数 SCHAR_MIN -127 定义最小值签署的字符 SCHAR_MAX 127 定义最大值签署 ...

  3. c语言中一些常用的逻辑运算,C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  4. C语言中最常用标准库

    标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h>   <limi ...

  5. C语言中最常用标准库函数

    标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h> <limits ...

  6. 关于C语言中一些常用函数的说明

    1.I/O函数 (1)scanf函数: int scanf(const char *format-..); 从标准输入流stdin中按格式format将数据写到参数表中;若操作成功,返回写到参数表中的 ...

  7. linux编译时开启宏,【spec】Linux上编译安装的spec文件中的常用路径以及宏变量

    我们在Linux上利用 rpmbuild 构建 rpm 安装包时,通过命令rpm --showrc 查看实现代码,另外直接通过 rpm --eval "%{macro}"来查看具体 ...

  8. C语言中的常用循环语句

    在C语言中,我们所熟悉的循环语句有for循环.while循环和do- while循环语句.下面依次展示语句用法: (1)for循环语句 for(初始化部分:条件判断部分:调整部分) { 循环语句: } ...

  9. c语言中的常用函数的使用,C语言的常用库函数使用方法分析及用途

    absread()读磁盘绝对扇区函数 原形:int absread(int drive,int num,int sectnum,void *buf) 功能:从drive指定的驱动器磁盘上,sectnu ...

最新文章

  1. 7年增长16倍,清华AI+ML课程学生数暴增 | AI Index 2018
  2. 无人车、超级高铁、智慧城市......这是一份来自未来的出行报告
  3. 2010年南非世界杯乌拉圭和韩国八强赛观后感
  4. java监听变量的变化_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
  5. Memcache工作原理总结
  6. solaris 10 安装oracle 10g
  7. C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
  8. JavaScript中九九乘法表制作
  9. 【JavaWeb】XML和Jsoup的相关内容
  10. shell下的常用语句
  11. 阿里云windows server 2012安装.net framework3.5失败解决方案
  12. 我在美团的八年,技术人必读
  13. 中国邮政支付宝卡通开通流程
  14. 010,spring boot 文件上传
  15. 测试移动信号频率的软件,移动设备的FM测试
  16. Python-snap7 安装和测试
  17. 数学建模英文论文写作
  18. tolua unity 报错_关于LUA+Unity开发_toLua篇【二】
  19. 一文读懂配置管理(CM)
  20. 不删除其他盘的文件情况下扩充C盘空间

热门文章

  1. 在DevExpress中使用CameraControl控件进行摄像头图像采集
  2. android 程序安装路径选择
  3. 文件打包成zip类型文件
  4. 细数人体十大最“无用”的器官。
  5. 【PHP 每日函数】第 03 周期
  6. V4L2开发要点【转】
  7. 简易django项目之登录验证
  8. GET和POST到底啥区别???
  9. eclipse如何修改dynamic web module version
  10. linux c 报错 warning: large integer implicitly truncated to unsigned type[-Woverflow]