黑马程序员——C语言预处理总结


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------                           

C语言预处理总结

  所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。C语言提供提供了宏定义、条件编译和文件包含三种预处理指令。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。

1.预处理  

     1>预处理都是以#开头的 

    2>预处理指令主要有三种,分别是  

         (1)宏定义

            (2)条件编译

            (3)文件包含

   3>预处理指令在代码翻译为0,1之前执行  

   4>预处理指令的书写位置是随意的,但是预处理指令也有作用域,是从编写指令的那一行代码开始一直文件结束  


2.宏定义  

  2.1  宏定义: #define  宏名 值

    宏名一般大写,如#define COUNT 5

#include<stdio.h>
#define COUNT 5

int main()
{
 //int ages[COUNT] = {15, 23, 27, 29, 20};
 int ages[COUNT] = {14,22,23,25,11}; 
int i;
 for(i = 0;i<COUNT;i++)
{
  printf("ages[%d] = %d\n",i,ages[i]);
}
 int a = COUNT;
 printf("a = %d\n",a);
 #undef COUNT
 //int b = COUNT;
 //printf("b = %d\n",b);
return 0;
}

 从上面的代码可以看出,定义的宏COUNT 从#define COUNT 一直到#undef COUNT 宏是有效的。用上述的程序遍历数组,会输出全部的数组元素。在编译时,编译器会把所有的COUNT (严格意义上来说是从定义到#undef )替换为对应的值,在此处替换5。而本程序的最后两句会报错,原因是#udef之后宏定义失效,会提示未定以的变量变量COUNT。  

2.2 宏定义注意

  1>宏名一般用大写或者以k开头,变量名一般小写

  2>宏的在作用域内,一直有效,直到文件结束或者遇到#undef标识结束

  3>宏只是文本的替换并没有参与运算,在定义有参数的宏时,一定要严谨

  4>带参数的宏定义执行效率高(宏在编译时直接进行文本替换,而函数实在程序运行时执行的)

<span style="font-size:18px;">#include<stdio.h>
//不严谨的宏定义 sum(2+3,1+6) *sum(2+3,1+6) ==2+3+1+6*2+3+1+6
//#define sum(a,b) a+b
#define sum(a,b) ((a)+(b))
#define squar(a) ((a)*(a))
int main()
{
int c = sum(2,5)*sum(3,5);
printf("c = %d\n",c);
int d = squar(3+5+6);
printf("d = %d\n",d);
return 0;
}</span>


3.条件编译

   条件编译主要有#if 条件,#if defined (条件)#endif以及#if!def  条件 #endif.

3.1第一种条件编译指令

  语法:

  #if d条件1

    ......code.....

        #elif 条件2

   ........code.....

            ..................

        #elif 条件n

   ........code.....


         #else

   ........code.....

       #endif

最后的#endif不要漏掉,不然会包错误,提示没有}.。

  错误提示如下:

  03-条件编译.c: In function ‘main’:  03-条件编译.c:34:0: error: unterminated #elif     #if(10==COUNT)    ^  03-条件编译.c:37:7: error: expected declaration or statement at end of input         }         ^

 由于是预处理指令,这里的条件是宏定义。

<span style="font-size:18px;">#include<stdio.h>

#define COUNT 5
int main()
{

  #ifdef COUNT
    printf("hahh\n");
  #endif
  
  #ifndef COUNT
   printf("Heheh\n");
  #endif
  /*
 #if defined COUNT
    printf("Haha!\n");
 #endif
 #if !defined COUNT
   printf("Hehehe!\n");
 #endif 
*/                                                              
/*
//int COUNT= 10;
  #if(10==COUNT)
      {
    printf("a = 10\n");
      }
  #elif(5==COUNT)
      {
    printf("a = 5\n");
      }
  #else
      {
    printf("a为其它值\n");
      }
 #endif
*/


/*
03-条件编译.c: In function ‘main’:
03-条件编译.c:34:0: error: unterminated #elif
   #if(10==COUNT)
 ^
03-条件编译.c:37:7: error: expected declaration or statement at end of input
       }
       ^

*/
/*
  int a = 10;
  if(10==a)
      {
    printf("a = 10\n");
      }
  else if(5==a)
      {
    printf("a = 5\n");
      }
  else
      {
    printf("a为其它值\n");
      }
*/


 return 0;
}</span>


3.2 #if defined MAX

                      ......code1........

         #endif

       #if !defined Max

                  .....code2.....

       #endif

  假如程序中定义了宏Max则把code1编译进去,否则编译code2。

3.3   #ifdef A

             ...code1...

       #endif

    #ifndef A

         .....code2.....

  #endif

  作用和上面的相同,定义宏编译code1,否则编译code2。


3.4条件编译使用注意

  1>条件编译条件一般为宏

       2>条件编译写#if后,一定要加上#endif,不然会报上述的错误

   

4.文件包含

4.1文件包含一般用#include指令

  在C语言中,同一文件可以包含多次,会增加编译负担,可以通过和条件编译指令结合,让多次同一文件包含只编译一次。代码如下:

       

<span style="font-size:18px;"> #ifdef  _STUD_H_

   #define _STUD_H_

  int  sum(int a,int b);

  #endif</span>

4.2文件包含注意

 1>#inlcude后面 <>表示是系统自带的文件,""表示是自己定义的文件

   2>不允许循环包含,如A 包含b,b又包含A


 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------                             
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值