zoukankan      html  css  js  c++  java
  • 谭浩强C预处理命令

    一、预处理命令概述

    1、预处理命令一般放在源文件的开头部分,在进行编译之前进行预处理:由预处理程序对源程序中的预处理部分作处理,完毕后进行编译阶段。

    2、预处理命令包括:宏定义、文件包含、条件编译等。

    二、宏定义

    1、无参宏定义

    (1)定义形式为:#define 标示符 字符串。其中标示符一般写为大写字母,用于区分变量名;字符串部分可以是数字,字符、表达式、格式串等。

    (2)无参宏的预处理过程:

    在源程序进入编译之前,由预处理程序对源程序中出现的宏定义名称用宏定义中的字符串替代,预处理程序的作用仅仅为替换功能,不处理其他任何事务。当源程序中宏定义名称用引号包含的时候,则预处理程序不作替换处理。

    
    

    #define M 3*m
    void main()
    {
    int m,k;
    char c1='M';
    char c2[]="M";   //M被单引号、双引号括起,预处理命令不替换
    printf("input a number:\n");
    scanf("%d",&m);
    k=M;
    printf("Manswer=%d.\ncharactor=%c.\nstring=%s.\n",k,c1,c2);   //输出格式串符中M因为也包含在双引号内,不做替换
    } 

    2、带参宏定义

    (1)定义形式为:#define 标示符(形式参数表) 字符串。

    (2)预处理过程与无参宏定一致,仅在预处理过程中增加用实际参数同时替换掉形式参数。

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

    (3)带参宏定义时,不给形式参数分配内存单元,这点也很好理解:宏定义仅仅为预处理过程服务,而预处理过程不涉及代码执行。

    三、文件包含

    1、命令形式:#include"文件名"  或#include<文件名>

    2、文件包含的功能:预处理程序将包含命令指定的文件插入包含命令位置。

    四、条件编译

    1、形式1:

    #ifdef 标示符              //如果该标示符已被宏定义则编译程序段1
       程序段1
    #else                     //如果上述标示符未被宏定义则编译程序段2
    程序段2
    #endif

    2、形式2:

    #ifndef 标示符             //与形式1相反条件
       程序段1
    #else
       程序段2
    #endif

    3、形式3:

    #if 常量表达式             //如果常量表达式为真则执行程序段1 
       程序段1
    #else                   //反之则执行程序段2
       程序段2
    #endif

    4、条件编译语句可放于源程序任意位置。

    五、小结

    1、预处理命令是编译过程之前的一道工序,主要功能是通过替换源程序中的宏名称和包含程序外部文件,同时可通过条件编译选择编译范围以明确最终进入编译阶段的代码。

    2、通过下面例子,更好地理解宏定义的仅仅作为“替换”的作用:

    #define SQ(y) (y)*(y)
    void main()
    {
      int a,sq;
      printf("input a number:\n");
      scanf("%d",&a);
      sq=SQ(a+1);          //预处理结束后源程序该处为:(a+1)*(a+1)
      printf("sq=%d.",sq);
    }
    #define SQ(y) y*y
    void main()
    {
      int a,sq;
      printf("input a number:\n");
      scanf("%d",&a);
      sq=SQ(a+1);             //预处理结束后源程序该处为:a+1*a+1
      printf("sq=%d.",sq);
    }

      

  • 相关阅读:
    Linux进程间通信分类 以及 pipe的原理实现
    单链表的快速排序
    再谈二分查找
    数据库范式
    二分查找法浅析
    C# Observer设计模式
    C# 交错数组浅析
    C语言初学 数学中带根号的复杂计算问题
    C语言初学 计算三角形面积问题
    C语言初学 简单定义圆的面积计算问题
  • 原文地址:https://www.cnblogs.com/tsembrace/p/3114270.html
Copyright © 2011-2022 走看看