Chinaunix首页 | 论坛 | 博客
  • 博客访问: 401342
  • 博文数量: 101
  • 博客积分: 2324
  • 博客等级: 大尉
  • 技术积分: 887
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 19:28
文章分类

全部博文(101)

文章存档

2012年(3)

2011年(60)

2010年(38)

分类: C/C++

2011-03-22 21:39:52

1.简述
  预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。
  预处理功能: 宏定义,文件包含,条件编译等。
2.宏定义
  在c语言程序中允许一个标私服来表示一个字符串,称为宏。
  在c中宏分为有参数和无参数两种。
2.1 无参宏
    无参宏的名后不带参数。
    格式: #define 标识符 字符串
    # 表示 预处理命令 define 为宏定义命令 表示符 为定义的宏名 字符串 可以是 常数 表达式 格式串等。
   例如: #define M (y*y+3*y)
         

   例子:
  

#define M (y*7-y/2)
main(){
 int s,y;
 printf("input a number: ");
 scanf("&d",&y);
 s=3*M
 printf("s= %d\n",s);
}

 
宏定义时应注意以下几点:
 a. 宏定义中的字符串可以的任何数,预处理程序对它不做任何检测,如有错误,只能在编译已被宏展开后的源程序发现。
 b. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
 e. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止操作可使用#undef命令。
   例如:

   

#define PI 3.14
main()
{
  ....
}
#undef PI
f1()
{
...
}


表示只能在main函数中有效,在f1中无效
d. 宏名在源程序中如用引号阔气来,则预处理程序不对其作宏代换。
   例子:

  #define OK 23
  main()
 {
   printf("OK");
   printf("\n");

 }
e. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的红名。
   例如:
        #define P 2
        #define S P*2
f. 可以用宏定义表示数据类型,使书写方便。
   例如:
        #define STU struct str
  
g. 对 输出格式作宏定义,可以减少书写麻烦。
   例子:
    
  

#define P printf
#deifne D "%d\n"
#define F "%f\n"
main()
{
 int a=5,c=8,e=11;
 float b=3.8,d=9.7,f=21.08;
 P(D F,a,b);
}


4. 带参数的宏定义
   格式:define 宏名(形参) 字符串
   例子:
        #define M(y) x*3
        K=M(4);
   例如:

#define MAX(a,b) (a>b)?a:b
main()
{
  int x,y,max;
  printf("input two numbers ");
  scanf("%d%d",&x,&y);
  man=MAX(x,y);
  printf("max=%d\n",max);

}

warning:
a.宏名和形参之间不能出现空格
b.形参不分配内存单元,因吃不必作类型定义。
c.在宏中的形参是标识符,而宏调用中的实参可以是表达式。
  例如:


#define SQ(y) (y)*(y)
main()
{
  int a,sq;
  printf("input a number : ");
  scanf("%d",&a);
  sq=SQ(A+1);
  printf("sq=%d\n",sq);
}

d. 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。但是也应同时在整个字符串外加括号。
e. 宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。
   例如:
        #define SSSW(s1,s2,s3,v) s1=1*x;s2=2*e;s3=w*h;v=s*d/d;
5. 条件编译
   条件编译有三种形式:
   a. 第一种
      #ifdef 标识符
        程序1
      #else
        程序2
      #endif
      功能:如果标识符已被#define命令定义过则对程序1进行编译;否则对2进行编译。如果2为空,#else也可以没有。
   b. 第二种
     #ifndef 表示符
        程序1
     #else
        程序2
     #endif
     功能:与第一种功能相反。
   c.第三种
     #if 常量表达式
          程序1
     #else
          程序2
     #endif
     功能:如常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。

阅读(504) | 评论(0) | 转发(0) |
0

上一篇:数组

下一篇:指针

给主人留下些什么吧!~~