zoukankan      html  css  js  c++  java
  • c语言学习之基础知识点介绍(二十):预处理指令

    一、预处理指令的介绍

    预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令。
    特点:以#开头,不要加分号。

    #include:
      文件包含指令
      把指定文件的内容复制到相应的位置

    #define:
      #define 宏名 替换的值;
      宏、宏定义或者还叫宏代换。
      作用:就是在编译之前把所有用到这个宏的地方,替换成你指定的东西
      规范:宏名大写,可以跟变量区分开来

    之前学的宏:
      INT32_MAX
      INT32_MIN

    宏不占据内存空间,只是帮你做简单的替换。

    注意:

    1.宏只是简单的替换,不参与编译,宏不会编译成指令集。
    2.宏可以写在任意位置,但是一定要调用它之前。
    3.宏可以嵌套,展开的时候依次展开。
    4.宏只是简单的替换,如果替换的内容是表达式,它不会帮你先计算出结果,而是把整个表达式替换过去。
    5.宏替换的作用域:默认是从声明的位置到文件的结束,可以用#undef 宏名 结束宏的作用。
    6.双引号里面如果有遇到宏名,不会做替换,如果单引号里面写的是宏名也不会替换。
      

     代码实例:

    #include <stdio.h>
    
    #define SUM 10 + NUM
    
    #define NUM 10
    
    #define MY_TEST int num = 30;
    
    #define GET_SUM 10+30
    
    #define HAHA GET_SUM*2
    
    #define A 'a'
    
    int main(int argc, const char * argv[]) {
    
        printf("%d
    ",TEST_NUM);
    
    //    char ch = 'A';
    //    
    //    printf("%c
    ",ch);//A
        
    //    printf("NUM 
    ");//NUM
        
        
        #undef NUM
        
        /*
        printf("%d
    ",NUM);//编译的时候,把这句话换成了printf("%d
    ",10);
        
        int num = NUM + 30; //替换成了 int num = 10 + 30;
        
        printf("num=%d
    ",num);
        */
    
        //int num = INT32_MAX; //编译的时候把它替换成了  int num =  2147483647;
        
    //    int num = SUM;
    //    
    //    printf("num=%d
    ",num);
        
    //    MY_TEST
    //    printf("%d
    ",num);
        
    //    printf("%d
    ",GET_SUM);//40
        
    //    int res = GET_SUM * 2; // int res = 10+30*2;
    //    printf("%d
    ",res);//70
    //    printf("%d
    ",HAHA);//先替换成(GET_SUM)*2  然后再替换成 (10+30)*2
        return 0;
    }

    二、预处理之#if-#elif -#else

    /*
    用的比较少
     #if 宏的表达式
    
     #elif 宏的表达式2
     
     #else
     
     #endif
     
        有选择的编译或者不编译某些代码
     
     注意:#if这只能跟宏
          一定要以#endif结尾
    
    */
    
    #include <stdio.h>
    #define SCORE 65
    
    int main(int argc, const char * argv[]) {
        //以下永远只有一条语句参与编译
    #if SCORE >= 90
        printf("法拉利
    ");
    #elif SCORE >= 80
         printf("奔驰
    ");
    #elif SCORE >= 70
         printf("大众
    ");
    #elif SCORE >= 60
        printf("拖拉机
    ");
    #else
        printf("吊打
    ");
    #endif
        return 0;
    }

    三、预处理之#ifdefine

    /*
     
     #ifdef:
                 #ifdef 宏名
                    代码段;
                 #endif
     
            语义:如果定义了宏名,那么就编译代码段,否则不编译
     
     
     #ifndef:
                 #ifndef 宏名
                     代码段;
                 #endif
     
            语义:如果没有定义这个宏,那么就编译代码段,否则不编译
     
     
     作用:1.防止重复导入
     
    */
    
    #include <stdio.h>
    
    #include "test.h"
    
    
    
    //#define TEST
    
    int main(int argc, const char * argv[]) {
       
        /*
    #ifdef TEST
        
        printf("哈哈哈哈哈,我被定义了
    ");
    #endif
        */
        
    #ifndef TEST
        
        printf("哈哈哈哈哈,我被定义了
    ");
    #endif
        
        return 0;
    }

    四、有参数的宏

    /*
     
        #define 宏名  替换的值
     
     
        有参数的宏:
                #define 宏名(参数列表) 参数1+参数2
    */
    
    #include <stdio.h>
    
    #define MY_NUM(a) a
    
    #define MY_SUM(a) a*2
    
    #define MY_SUM2(a,b) a*b
    
    int main(int argc, const char * argv[]) {
        
        /*
        int num = MY_NUM(30);
        
        printf("num=%d
    ",num);
        
        
        int num2 = MY_SUM(20);
        
         printf("num2=%d
    ",num2);//40
        
        printf("%d
    ",MY_NUM(50));//50
        
        
        printf("%d
    ",MY_SUM(50));//100
        
        int num3 = MY_SUM2(10, 20);
        
        printf("num3=%d
    ",num3);
        */
        
        char ch2 = 'z';
        
        char ch = MY_NUM(ch2);
        
        printf("%c
    ",ch);//z
        
        return 0;
    }

    五、条件编译的用处

    /*
     
     条件编译:
            就是有选择的编译或者不编译某段代码
     
        #if-#elif-#else-#endif
     
        #ifdef-#endif
     
        #ifndef-#endif
     
     
     用来开发时的测试调试,能够改一个值就可以让这些输出的语句消失(不参与编译),就可以达到一次性把所有调试语句“删除”的目录
     
    */
    
    #include <stdio.h>
    
    //#define MY_DEBUG
    
    #ifndef MY_DEBUG
    
        #define LOG(a,...)
    
    #else
    
        #define LOG(a,...) printf(a, ##__VA_ARGS__); //就代表第二个参数是可变的,你可以传,也可以不传,传的话也可以传一个或者多个
    
    #endif
    int main(int argc, const char * argv[]) {
        LOG("哈哈哈哈,测试1,a=%d b=%d
    ",a,b);//第二个参数,只传了2个
        LOG("哈哈哈,测试2
    "); //第二个参数,一个都没传
        
        LOG("z=%d,x=%d,q=%d,v=%d
    ",z,x,q,v);//第二个参数,传了4个
        return 0;
    }
  • 相关阅读:
    Eclipse 中怎样自动格式化代码?
    如何使用Jfreechart生成柱状图?
    ADT OOP
    5.2 Construction for Reuse
    Lab6实验的一些思考
    软件构造的八个多维视图
    软件构造笔记5.1 Metrics, Morphology and External Observations of Reusability
    事后诸葛亮之感谢
    (Model)针对编译错误的友好提示
    第二次结对作业
  • 原文地址:https://www.cnblogs.com/bobo-pcb/p/4952448.html
Copyright © 2011-2022 走看看