一、宏的定义
宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。
定义形式
#define 宏名 字符串
1)#表示这是一条预处理命令,所有的预处理命令都以 # 开头。宏名是标识符的一种,命名规则和变量相同。字符串可以是数字、表达式、if语句、函数等。
2)这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。
3)程序中反复使用的表达式就可以使用宏定义
注意:宏只做替换、不做运算
二、#的使用
显示出宏定义的参数
#define PRINT_SQR(x) print("The square of "#x" is %d.\n, ((x)*(x)))
int y = 5;
PRINT_SQR(y); //The square of y is 25
三、##的使用(粘合剂)
连接符,将两个宏参数连接在一起。
#define VAR_EXT(x) var##x
int var1 = 10;
int var2 = 20;
printf("%d\n", VAR_EXT(1)); //printf("%d\n",var1); 10
四、条件编译
常用用法:处理文件重复包含;区分不同版本代码
//Test.h
#ifndef _TEST_H_
#define _TEST_H_
#include "test2.h"
#include "test3.h"
#include "test4.h"
#endif
注释代码块
#if 0
/*注释在这里*/ 一会要编译,一会不想编译的代码。
#endif
五、#include <stdio.h> 与 #include “stdio.h” 区别
#include "stdio.h"
当要调用某个函数时 先在用户自已编写的文件中查找,如果找不到再到库文件里去找,
#include <stdio.h>
是直接到库文件里去找
所以如果是调用自己写的函数的话就用#include "stdio.h",这种形式
而调用标准库函数的话就用#include <stdio.h>这种形式,可以提高速度
六、常用调试宏
__FILE__: 所在文件名
__FUNCTION__:所在函数名
__LINE__:所在行数
__DATE__:执行日期
__TIME__:执行时间
头文件:
//#define DEBUG
#ifdef DEBUG
#define dbg_print(format,args...) printf(format, ##args)
#else
#define dbg_print(format,args...) do{} while(0)
#endif
C文件:
void some_func(void)
{
dbg_print("Program is compiled on %s %s", __DATE__, __TIME__);
dbg_print("function %s() in file %s line %d get problem\n", __FUNCTION__, __FILE__, __LINE__);
....
}