#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(5)

SQUARE(a+1)

应该修改为:

#define  SQUARE(x)   ((x)*(x))

SQUARE(5)

SQUARE(a+1)

  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",12); return 0; }

输出结果:

The value is 12

  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 is 20

  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;
}

输出结果

  

 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;
}

输出结果:

3.宏命名

一般约定使用大写;与函数区分开;

4.#undef

 本指令用于移除一个宏定义;

 #undef name;

 如果现存的名字需要被重新定义,那么旧定义首先必须用#undef移除;

  

  

猜你喜欢

转载自www.cnblogs.com/weiyouqing/p/8995675.html
今日推荐