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宏学习的更多相关文章

  1. 预处理命令#define #undef #if #endif 的基本用法

    C#的预处理命令其实还是蛮有用的,但是真正使用过得人不多,这个介绍一下平时用的比较多的预处理命令中的几个:#define,#undef ,#if,#endif.除此之外还有一些预处理命令#warnin ...

  2. 笔记:OSAL st 宏学习 do { x } while (__LINE__ == -1)

    笔记:OSAL st 宏学习 do { x } while (LINE == -1) #define st(x) do { x } while (__LINE__ == -1) 这段的意思是让代码可以 ...

  3. C/C++预处理指令#include,#define,#undef,#if,#ifdef,#ifndef,#elif,#endif,#error......

    本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...

  4. 关于#define 的宏替换的一些问题

    #define PI 3.14; int main() { , s = ; s = r * r * PI; s = PI * r * r; // s = 3.14; * r * r; printf(& ...

  5. 结构体中使用#define定义宏

    struct  hostent {   char    *h_name;        /* official name of host */   char    **h_aliases;    /* ...

  6. C++ 中 #ifndef, #define, #endif 宏定义

    目的:为了保证包含的内容只被程序(include) 和编译了一次.判断预处理器常量是否已被定义. 预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件 ...

  7. #define #undef

    #include <stdio.h> int main( void ) { #define MAX 200 printf("MAX= %d\n",MAX); #unde ...

  8. #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): ...

  9. 预处理、const、static与sizeof-用#define实现宏并求最大值和最小值

    1:实现代码: #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)>(y)) ? (x):(y)) 需要注意的几点: ...

随机推荐

  1. js 清除文本中的html标签

    text.replace(/<[^>]+>/g,"");

  2. gdb调试的艺术——Debug技巧

    调试的艺术——Debug技巧总结 (本文从写好的wiki里粘出来的,格式稍乱不影响阅读) 用Q+编号代表问题,A+编号代表答案.用这种方式组织.如无特别说明,这些技巧都是针对Visual Studio ...

  3. bzoj2441 [中山市选2011]小W的问题(debug中)

    2441: [中山市选2011]小W的问题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 487  Solved: 186[Submit][Statu ...

  4. bigdecimal的使用

    BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂. ...

  5. Python设置函数调用超时

    http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景:        最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够 ...

  6. 【Android开发日记】之入门篇(十一)——Android的Intent机制

    继续我们的Android之路吧.今天我要介绍的是Android的Intent. 对于基于组件的应用开发而言,不仅需要构造和寻找符合需求的组件,更重要的是要将组件有机的连接起来,互联互通交换信息,才能够 ...

  7. xmlSerializer属性的使用

    学习了XmlAttribute,XmlElement属性的定义和使用. Order类定义 using System; using System.Collections.Generic; using S ...

  8. NEMA协议详解

    NEMA协议的由来 NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The   National Marin ...

  9. (二十五)epoll深入理解续

    转自:http://blog.csdn.net/yusiguyuan/article/details/15027821 在Linux的网络编程中,很长的时间都在使用select来做事件触发.在linu ...

  10. VS2005调试无法进入断点,暂停、停止、重编按钮为灰色

    没装IE8之前(IE7),Vs2005调试还好用,装了IE8之后, Vs2005的WebSite程序按F5无法正常调试. 需要手动附加到进程, 比较麻烦, 据说还有种方法, 把所有IE窗口都关掉, 再 ...