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\n",TEST_NUM);

//    char ch = 'A';
//    
//    printf("%c\n",ch);//A
    
//    printf("NUM \n");//NUM
    
    
    #undef NUM
    
    /*
    printf("%d\n",NUM);//编译的时候,把这句话换成了printf("%d\n",10);
    
    int num = NUM + 30; //替换成了 int num = 10 + 30;
    
    printf("num=%d\n",num);
    */

    //int num = INT32_MAX; //编译的时候把它替换成了  int num =  2147483647;
    
//    int num = SUM;
//    
//    printf("num=%d\n",num);
    
//    MY_TEST
//    printf("%d\n",num);
    
//    printf("%d\n",GET_SUM);//40
    
//    int res = GET_SUM * 2; // int res = 10+30*2;
//    printf("%d\n",res);//70
//    printf("%d\n",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("法拉利\n");
#elif SCORE >= 80
     printf("奔驰\n");
#elif SCORE >= 70
     printf("大众\n");
#elif SCORE >= 60
    printf("拖拉机\n");
#else
    printf("吊打\n");
#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("哈哈哈哈哈,我被定义了\n");
#endif
    */
    
#ifndef TEST
    
    printf("哈哈哈哈哈,我被定义了\n");
#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\n",num);
    
    
    int num2 = MY_SUM(20);
    
     printf("num2=%d\n",num2);//40
    
    printf("%d\n",MY_NUM(50));//50
    
    
    printf("%d\n",MY_SUM(50));//100
    
    int num3 = MY_SUM2(10, 20);
    
    printf("num3=%d\n",num3);
    */
    
    char ch2 = 'z';
    
    char ch = MY_NUM(ch2);
    
    printf("%c\n",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\n",a,b);//第二个参数,只传了2个
    LOG("哈哈哈,测试2\n"); //第二个参数,一个都没传
    
    LOG("z=%d,x=%d,q=%d,v=%d\n",z,x,q,v);//第二个参数,传了4个
    return 0;
}

 

posted @ 2015-11-10 11:58  祁临芯  阅读(646)  评论(0编辑  收藏  举报
友情链接:初心商城