#define,#undef宏学习
1.预处理器
1.1预处理符号:
__FILE__ :进行编译的源文件名字
__LINE__ :文件当前行的行号
__DATA__ :文件被编译的日期
__TIME__ :文件被编译的时间
__STDC__ :如果编译器遵循ANSIC,其值就为1,否则未定义
2.#define宏
宏的声明方式:
#define name(para_list) stuff
注意:name和左括号之间不能有空格;
2.1需要注意的几点:
1.所有用于对数值表达式进行求值的宏定义都应该多加括号;
以下错误代码:
#define SQUARE(x) x*x SQUARE() SQUARE(a+)
应该修改为:
#define SQUARE(x) ((x)*(x)) SQUARE() SQUARE(a+)
2.如果宏定义中的语句非常长,那么可以写成多行,除了最后一行之外,每行的末尾都要加一个反斜杠 “ \ ”
#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.参数名将被他们的值所代替;
技巧:
1.邻近字符串自动连接:
#include <stdio.h>
#define PRINT(FORMAT,VALUE) printf("The value is " FORMAT "\n",VALUE)int main(void)
int main(void)
{
PRINT("%d",);
return ;
}
输出结果:
The value is
2.预处理器把一个宏参数转换成一个字符串:#argument 这种结构被预处理器翻译为字符串 “argument”
#include <stdio.h>
#define PRINTF(FORMAT,VALUE) printf("The value "#VALUE" is " #FORMAT "\n",VALUE)
int main(void)
{
PRINTF(%d,);
return ;
}
输出结果:
The value is
3.使用##结构,将位于其两边的符号连接成一个符号;
#include <stdio.h> #define ADD_TO_SUM(SUM_NUMBER,VALUE) sum ## SUM_NUMBER += VALUE int main(void)
{
int sum5 = ;
ADD_TO_SUM(,);
printf("%d.\n",sum5);
return ;
}
输出结果

2.3.带副作用的宏参数
当宏参数在宏定义中出现次数超过一次时,那么将可能出现副作用;
#include <stdio.h> #define MAX(a,b) ((a)>(b)?(a):(b)) int main()
{
int x=;
int y=;
int z=;
z=MAX(x++,y++); //z = ((x++)>(y++)?(x++):(y++))
printf("x = %d,y = %d,z = %d\n",x,y,z);
return ;
}
输出结果:

3.宏命名
一般约定使用大写;与函数区分开;
4.#undef
本指令用于移除一个宏定义;
#undef name;
如果现存的名字需要被重新定义,那么旧定义首先必须用#undef移除;
#define,#undef宏学习的更多相关文章
- 预处理命令#define #undef #if #endif 的基本用法
C#的预处理命令其实还是蛮有用的,但是真正使用过得人不多,这个介绍一下平时用的比较多的预处理命令中的几个:#define,#undef ,#if,#endif.除此之外还有一些预处理命令#warnin ...
- 笔记:OSAL st 宏学习 do { x } while (__LINE__ == -1)
笔记:OSAL st 宏学习 do { x } while (LINE == -1) #define st(x) do { x } while (__LINE__ == -1) 这段的意思是让代码可以 ...
- C/C++预处理指令#include,#define,#undef,#if,#ifdef,#ifndef,#elif,#endif,#error......
本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...
- 关于#define 的宏替换的一些问题
#define PI 3.14; int main() { , s = ; s = r * r * PI; s = PI * r * r; // s = 3.14; * r * r; printf(& ...
- 结构体中使用#define定义宏
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* ...
- C++ 中 #ifndef, #define, #endif 宏定义
目的:为了保证包含的内容只被程序(include) 和编译了一次.判断预处理器常量是否已被定义. 预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件 ...
- #define #undef
#include <stdio.h> int main( void ) { #define MAX 200 printf("MAX= %d\n",MAX); #unde ...
- #define定义宏函数 的正确使用
如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): ...
- 预处理、const、static与sizeof-用#define实现宏并求最大值和最小值
1:实现代码: #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)>(y)) ? (x):(y)) 需要注意的几点: ...
随机推荐
- BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】
题目 输入格式 输出格式 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. 输入样例 3 2 10 0 20 0 -10 0 -5 1 0 0 100 ...
- [CQOI2018]异或序列 (莫队,异或前缀和)
题目链接 Solution 有点巧的莫队. 考虑到区间 \([L,R]\) 的异或和也即 \(sum[L-1]~\bigoplus~sum[R]\) ,此处\(sum\)即为异或前缀和. 然后如何考虑 ...
- 导入android源码中的APP源码到eclipse
导入android源码中的APP源码到eclipse 一般最简单的办法就是创建新的android工程,选择create project from existing source选项,直接导入源码就OK ...
- Registering RHEL6 Clients into spacewalk
Before Starting(login to spacwalk server) 1.Create a base channel within Spacewalk (Channels > Ma ...
- Poj 2096 Collecting Bugs (概率DP求期望)
C - Collecting Bugs Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64 ...
- touchSlider插件案例
<!doctype html> <html lang="en"> <head> <title>jQuery手机图片触屏滑动轮播效果代 ...
- [poj2356]--Find a multiple ——鸽巢原理
题意: 给定n个数,从中选取m个数,使得\(\sum | n\).本题使用Special Judge. 题解: 既然使用special judge,我们可以直接构造答案. 首先构造在mod N剩余系下 ...
- nginx部署web.py项目
= =测试环境直接就python index.py就好啦 生产环境nginx + web.py + uwsgi 安装uwsgi... pip install uwsgi 首先把自己的代码小改一下... ...
- LVDS 数据通道详解 单8 单6
1.1.1 LVDS接口分类 1.1.1.1 单路6bit LVDS 这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此 ...
- Linux 设备驱动--- Poll 方法 --- Select【转】
转自:http://blog.csdn.net/yikai2009/article/details/8653842 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] Sele ...