Day12

预处理指令

预处理指令:
文件包含 include
宏定义 #define
条件编译 #if #else #endif

宏定义

  • 基本格式
#include <stdio.h>
#define URL "www.it666.com"
int main()
{
    /*
     * 宏定义:
     *   宏定义会在预处理的时候,用宏定义对应的值来替换宏
     * 宏定义格式:
     *   #define 宏名称 宏值
     * 应用场景:
     *   企业开发中分为开发和部署阶段
     *   例如在程序开发中会用到很多地址,用来替换更改的地址
     * 注意点:
     *   1.宏定义的后面不要写分号,因为宏定义是单纯的替换
     *   2.宏定义分为两种,一种是不带参数的宏定义,一种是带参数的宏定义
     */

    printf("%s\n", URL);
    return 0;
}
  • 不带参数的宏定义
#define URL "www.it666.com" //简单是替换
  • 带参数的宏定义
#include <stdio.h>
#define SUM(a, b) ((a)+(b))
#define PF(a) (a)*(a)
int main()
{
    /*
     * 带参数的宏定义
     * #define 宏名字(参数) 参数
     * 一些简单的函数,除了可以使用函数来封装外,还可以使用宏定义
     * 注意点: 宏定义无论有没有参数都是单纯的替换
     *
     * 在企业开发中如何选择宏定义还是函数
     * 1. 如果是函数的业务逻辑非常简单,建议使用宏定义,因为宏定义效率更高
     * 宏定义是在预处理的时候就执行了,函数是在运行的时候才执行,而且
     * 宏定义只会简单替换,函数还需要分配内存空间
     * 
     * 2.业务逻辑复杂,就使用函数
     * 
     * 注意点:
     * 1. 每个参数都要加上()
     * 2. 结果也需要加上()
     */

    printf("%i\n", SUM(10, 20));
    return 0;
}
  • 宏定义的作用域
#include <stdio.h>
#define COUNT 666
int main()
{
    /*
     * 宏定义的作用域
     *     和全局变量很像,都是从定义的那行开始,直到文件末尾,但是可以提前结束
     * 通过 #undef 宏名 来提前结束宏的作用域
     *
     */
    printf("%i\n",COUNT); //可以运行
    test();
    return 0;
}
#undef COUNT  //宏定义的作用域在这一行结束,后面的访问不到

void test(){ //可以运行
    printf("%i\n",COUNT);
}

条件编译

  • 基本格式
#include <stdio.h>
#define SCORE 100
int main()
{
    /*
     * 条件编译
     * 格式:
     * #if #else #endif 可以组成一对
     * #if 和 #endif 可以组成一对
     * #if #elif #else #endif 可以组合,其中#elif 可以有一个或者多个
     * 无论怎么组合, #endif都不可以省略,作用是告诉编译器条件编译的结束位置
     *   
     * 
     * 条件编译和 if条件判断很像,但是也有区别
     *   1. if else是在程序运行的时候执行
     *      #if #else #endif 是在预处理的时候执行
     *   2. if else语句中所有的代码都会被编译到程序中
     *      #if #else #endif条件编译 只有满足条件的语句才会被编译到程序中
     * 
     */

    /*
     * 注意点: 
     *   条件编译中不能获取变量的值,因为变量是在程序执行的时候才有的,而条件
     * 编译是在预处理的时候就执行了
     *   条件编译一般都会配合宏定义来使用,因为两者都是在预处理中执行
     */
#if 100 == SCORE
    printf("100分");
#else
    printf("不是100分");
#endif
    return 0;

}
  • 应用场景
    用来替换打印语句,因为打印语句很消耗性能
#include <stdio.h>
// 替换打印的条件编译
#define DEBUG 0

#if DEBUG == 1
#define NJLOG(format, ...) printf(format, ##__VA_ARGS__)
#else
#define NJLOG(format, ...)
#endif
int main()
{
    /*
     * 在开发阶段,经常使用打印的形式来调试程序
     * 但是打印非常消耗性能,所以再部署阶段都需要去除打印
     */
    for(int i = 0; i < 10; i ++){
        NJLOG("i = %i\n", i);
    }

    return 0;
}
  • 条件编译的另外两种格式
条件编译的另外两种格式
    第一种格式
#ifdef #else #endif  作用是判断是否定义了某一个宏,定义了为真
    第二种格式
#ifndef #else #endif 作用是判断是否没有定义了某一个宏,没有定义了为真
  

条件包含

注意点: 头文件卫士

#include <stdio.h>

// 1.判断有没有定义名称叫做LNJ的宏
#ifndef LNJ
// 2.如果没有定义就会进入到这里面
// 2.定义一个叫做LNJ的宏
#define LNJ
int sum(int num1, int num2);
#endif

// 1.判断有没有定义名称叫做LNJ的宏
#ifndef LNJ
// 2.由于前面已经定义了, 所以条件不满足, 所以就不会进入这里面了
#define LNJ
int sum(int num1, int num2);
#endif

int main()
{
    /*
     * 条件包含 #include
     * #include <>
     *   会先从编译器的环境中查找对应的文件,如果没有再从系统的环境中查找对应文件
     * #include ""
     *   会先从当前的项目环境中查找对应的文件, 如果没有再从编译器的环境中查找对应的文件
     * 如果还没有再从系统的环境中查找对应文件
     * 
     * #include 作用: 将指定文件中的代码原封不动的拷贝到#include位置
     * #include执行时间: 预处理时候执行
     */
    
    
    /*
     * 注意点:
     *    已知函数的定义不可以重复,但是函数的声明可以重复
     *    如果函数的声明被include导入多次,那么会影响程序的编译效率
     * 所以在C语言中引入了头文件卫士的概念,专门用于解决重复导入的问题
     * 
     */
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 目录 一.预处理的工作方式... 3 1.1.预处理的功能... 3 1.2预处理的工作方式... 3 二.预处理...
    朱森阅读 1,367评论 0 2
  • 你说什么,我听不到,如海里咆哮。 你做什么,我看不到,如雾里缭绕。 你笑什么,我见不到,如河里逆潮。 你想什么,我...
    鱼盖阅读 251评论 0 2
  • 跃迁年的五月回顾: 一、在梦想天使班践行已2个月,基本做到了6:30前完成各项任务并在践行群打卡,同时轮值组长一周...
    龙马行天下阅读 251评论 0 2
  • 今天是5月13日,也就是妈妈们的节日——母亲节。我该准备一份什么样的礼物送给妈妈呢?贺卡、还是玫瑰花呢?我感觉都不...
    秦淑怡阅读 240评论 1 2