开发者

详解C语言中的预处理命令

开发者 https://www.devze.com 2022-12-05 10:34 出处:网络 作者: 畅游星辰大海
目录一、预处理命令简介二、宏定义1、宏定义的定义2、宏定义的使用3、宏定义的终止——#undef三、文件包含初学C语言的时候,我们会在开头写下一句话,#include<stdio.h>,这就是预处理命令,下面我们
目录
  • 一、预处理命令简介
  • 二、宏定义
    • 1、宏定义的定义
    • 2、宏定义的使用
    • 3、宏定义的终止——#undef
  • 三、文件包含

    初学C语言的时候,我们会在开头写下一句话,#include<stdio.h>,这就是预处理命令,下面我们通过这篇文章来了解一下。

    一、预处理命令简介

    以#开头、以换行符结尾的行称为预处理指令,常用的有宏定义,文件包括,条件编译。

    二、宏定义

    # define   标识符   单词串

    使用原理:define指令定义一个标识符来代表一个字符串,在源程序中发现该标识符时,都用改字符串替换,以形成新的源程序。

    标识符称为宏名,单词串称为宏体,替换过程称为宏替换。

    1、宏定义的定义

    宏定义可以嵌套,但不能递归

    正确:

    #define  R  2.0

    #define  Pi 3.1415

    #define  L  2*Pi*R

    #define  S  Pi*R*R

    错误:

    #define  M  M+1

    2、宏定义的使用

    无参数的宏定义

    #define SIZEphp 10
    #define A "%d"
    int main()
    {
       int arr[SIZE],i;
       for(i=0;i<SIZE;i++)
          scanf(A,&arr[i]);
       for(i=SIZE-1;i>=0;i++)
          printf(A,arr[i]);
       return 0;
    }
    
    int main()
    {
       int arr[10],i;
       for(i=0;i<10;i++)
          scanf("%d",&arr[i]);
       for(i=10-1;i>=0;i++)
          printf("%d",arr[i]);
       return 0;
    }
    

    有参数的宏定义

    #define SQRT(x)  ((x)*(x))
    #define MAX(x,y)  (((x)>(y))?(x):(y))
    int main()
    {
       float a=1.0,b=2.5;
       a=MAX(a,b)+3;
       printf("sqrt=%d\n",SQRT(a));
       return 0;
    }
    

    宏替换后的新程序

    int main()
    {
       float a=1.0,b=2.5;
       a=(((x)>(y))?(x):(y))+3;
       printf("sqrt=%d\n",((x)*(x)));
       return 0;
    }js
    

    编译器在处理源程序中的MAX(x,y),首先将MAX(x,y),中的x,y替换为MAX(a,b),再将MAX(a,b)替换为(((a)>(b))?(a):(b))

    注意事项:

    1、字符串常量不能被替换

    #define XYZ this is a test
    printf("XYZ");
    

    此时输出的是XYZ,而不是this is a test

    2、宏定义一般以换行结束,不要用分号结束,以免引起不必要的错误

    #define Pi  3.14;
    a=Pi*2*2;
    

    经过替换过后变成了

    a=3js.14;*2*2;
    

    上面的表达式很明显是错误的

    3、宏可以被重复定义,即#define可以在程序中多次出现

    4、如果宏是一个表达式,一定要将表达式用()括起来【如果有宏参数也要将宏参数括起来】,否则可能引起非预期的结果

    #define NUM1  10
    开发者_JAVA学习#define NUM2  20
    #define NUM3  NUM1+NUM2
    int main()
    {
       int a=2,b=2;
       a*=NUM3;
       b=b*NUM3;
       printf("a=%d,b=%d\n",a,b);
       return 0;
    }
    

    输出结果:

    a=60,b=40

    宏替换后的新源程序

    int main()
    {
       int a=2,b=2;
       a*=10+20;
       b=b*10+20;
       printf("a=%d,b=%d\n",a,b);
       return 0;
    }
    

    解决方法:

    将NUM3的定义改为,#define  NUM3  (NUM1+NUM2)

    3、宏定义的终止——#undef

    宏定义的作用域是从#define之后 到 该宏定义所在文件结束,通常把#define宏定义放在源文件的开头,如需提前终止,需要使用#undef

    #undef  标识符

    三、文件包含

    通常格式

    #include<文件名>  或者  #include"文件名"

    文件包含的优点:主要针对做一些大项目,分工合作,提高共用率,后期维护成本低

    使用<>:直接到系统指定的“文件包含目录”中去查找被包含的文件

    使用“”:首先到当前目录下去寻找被包含的文件,如果没找到再到系统指定的“文件包含目录”查找

    //程序员的输入:
    #include "head.h"
    #include "test.c"
    int main()
    {
       int a,b,c;
       fun1(a,b,c);
       fun2(a,b,c);
       return 0;
    }
     
    //编译后的源程序
    //head.h中的内容
    #define a  10
    //test.c中的内容
    int fun1(int a,int b,int c)
    {
       ...
    }
    int fun2(int a,int b,int c)
    {
       ...
    }
    //
    int main()
    {
       int a,b,c;
       fun1(a,b,c);
    编程客栈   fun2(a,b,c);
       return 0;
    }

    到此这篇关于详解C语言中的预处理命令的文章就介绍到这了,更多相关C语言预处理命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望python大家以后多多支持我们!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号