1、预处理符号
例子:
#include <stdio.h>
#define DEBUG_PRINT printf("FILE %s line %d:" \"x=%d, y=%d, z=%d," \__FILE__,__LINE__,x,y,z)
//或者如下:
//#define DEBUG_PRINT printf( "File %s line %d:" \
// "x = %d, y = %d, z = %d"\
// __FILE__, __LINE__, x, y, z)
int main(void)
{ int x=2, y=3, z=4;DEBUG_PRINT; // line 11
}运行结果:
File practice_define.c line 11:x = 2, y = 3, z = 4
解释:
practice_define.c:当前进行编译的源文件名
11:DEBUG_PRINT调用 在代码文件中的位置行
参考:https://blog.csdn.net/u011467781/article/details/39700587
2、#define 宏变量名
1、宏的声明方式:
#define name(para_list) stuff
注意:name和左括号之间不能有空格
;
2.1 注意点
- 所有用于
对数值表达式进行求值的
宏定义都应该多加括号
;
以下错误代码:
#define SQUARE(x) x*x
SQUARE(5);
SQUARE(a+1);
应该修改为:
#define SQUARE(x) ((x)*(x))
SQUARE(5);
SQUARE(a+1);
- 如果
宏定义中的语句非常长
,那么可以写成多行,除了最后一行之外,每行的末尾都要加一个反斜杠 “ \ ”
#define DEBUG_PRINT printf("FILE %s line %d:" \"x=%d, y=%d, z=%d" \__FILE__,__LINE__,\x,y,z)
2.2 #define替换
1、在程序中使用到#define定义的宏时,将被插入到程序中原来文本的位置;
2、参数名将被他们的值所代替;
2.2.1. 邻近字符串自动连接
#include <stdio.h>
#define PRINT(FORMAT,VALUE) printf("The value is " FORMAT "\n",VALUE)
int main(void)
{PRINT("%d",12);return 0;
}
输出结果:
The value is 12
2.2.2. 预处理器把一个宏参数转换成一个字符串:#argument 这种结构被预处理器翻译为字符串 “argument”
#include <stdio.h>
#define PRINTF(FORMAT,VALUE) printf("The value "#VALUE" is " #FORMAT "\n",VALUE)
int main(void)
{PRINTF(%d,20); return 0;
}
输出结果:
The value 20 is 20
2.2.3. 使用##结构,将位于其两边的符号连接成一个符号;
#include <stdio.h>
#define ADD_TO_SUM(SUM_NUMBER,VALUE) sum ## SUM_NUMBER += VALUE
int main(void)
{int sum5 = 0;ADD_TO_SUM(5,25);printf("%d.\n",sum5);return 0;
}
输出结果:
25.
2.3 带副作用的宏参数
当宏参数在宏定义中出现次数超过一次时
,那么将可能出现副作用。
#include <stdio.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
int main()
{int x=5;int y=8;int z=0;z=MAX(x++,y++); //z = ((x++)>(y++)?(x++):(y++))printf("x = %d,y = %d,z = %d\n",x,y,z);return 0;
}
输出结果:
x = 6,y = 10,z = 9
3、宏命名
一般约定使用大写;
与函数区分开;
4.#undef
1、作用:本指令用于移除一个宏定义
,即在后面取消以前定义的宏定义。
2、格式:#undef name
。其中,标识符name是一个宏名称。
注意:
a、如果现存的名字需要被重新定义
,那么旧定义首先必须用#undef移除
;
b、如果标识符name当前没有被定义成一个宏名称,那么就会忽略该指令
;
c、一旦定义预处理器标识符,它将保持已定义状态且在作用域内
,直到程序结束
或者使用#undef 指令
取消定义。
d、#define 与 #undef 指令可以放在程序任何位置
。
参考:https://www.cnblogs.com/weiyouqing/p/8995675.html