预处理指令:

程序猿编写的代码不是标准C代码,并不能被真正的编译器索编译,需要一段程序把代码翻译一下。
翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都是预处理指令查看预处理的过程:gcc -E code.c   把预处理结果显示在终端上gcc -E code.c -o code.i 把预处理的结果存储到code.i文件中预处理指令的分类:#inlcude    文件包含#include<>  从系统指定目录下查找并导入头文件#include""  先从文件当前目录下找,找到就导入该头文件;如果找不到,再从系统指定目录下找并导入头文件操作系统通过环境变量来指定头文件的查找路径,或者通过设置编译参数来指定头文件的查找路径-I/path.bashrc#define     宏定义宏常量:    #define MAX 100优点:提高代码的扩展性(方便批量修改)、提高可读性、提高安全性、还可以在case后面使用注意:一般宏名全部大写,末尾不要加分号【局部变量全部小写、全局变量首字母大写、指针变量+p、数组arr、字符串str、函数名全部小写+下划线】预定义好的宏:__func__    获取函数名__FILE__    获取文件名__LINE__    获取当前行号__DATE__    获取当前日期__TIME__    获取运行时间宏函数:    其实就是带参数的宏宏函数不是真正的函数,不检查参数类型,没有传参,没有返回值,只有计算的结果#define sum(a,b) a+b1、把代码使用到的宏函数替换为宏函数后面的代码。2、再把宏函数代码中使用到的参数替换为调用者提供的参数宏函数的二义性:由于宏代码所处的位置、参数不同导致宏有不同的功能,这就叫做宏的二义性。如何避免宏的二义性:1、宏函数整体加小括号,每个参数都加小括号2、使用宏函数时,不要提供带自变运算符的变量作为参数注意1:容易出选择题,例如:哪个宏有二义性、宏函数的运算结果注意2:定义宏尽量别换行,如果要换行要在每行末尾加上续航符\,建议宏函数最外面加上大括号运算符:#       把宏函数的参数变成字符串##      合并两个参数变成一个标识符普通函数与宏函数的区别?它们是什么:普通函数:是一段具有某项功能的代码段,会被编译成二进制指令存储到代码段内存中,函数名就是首地址,有独立的命名空间、栈内存宏函数:是一个带参数的宏,并不是真正的函数,而只是代码的替换,仅仅只是使用起来像函数有什么不一样:函数:      返回值      类型检查    安全    压栈、出栈  速度慢  跳转宏函数:    运算结果    通用        危险    替换       速度快  冗余条件编译:根据条件决定那些代码是否参与最终的编译版本控制:#if#elif#else#endif头文件卫士:防止头文件被重复包含#ifndef 宏名#define 宏名#endif 判断调试:#ifdef 宏名(DEBUG)#else#endif用于输出调试信息:#ifdef DEBUG#define debug(...) printf(__VA_ARGS__)#else   #define debug(...)#endif#define error(...) printf("%s:%s:%d %s:%m %s %s\n",__FILE__,__func__,__LINE__,__VA_ARGS__,__DATE__,__TIME__)

头文件应该怎么写:

问题:头文件可能被任意个源文件包含,意味着头文件中的内容会在多个目标文件中存在,合并时不能有冲突。
重点:头文件中只能编写声明语句,不能有定义语句全局变量声明    extern int num;函数声明        宏常量宏函数typedef 类型重定义结构、联合、枚举的类型声明

头文件的编写原则:

1、为每一个.c文件编写一份.h文件,.h文件是对.c文件的说明
2、如果需要用到某个.c文件中的函数、变量、宏,只需要把它的头文件导入
3、.c也需要导入它的.h文件,目的是为了让声明和定义一致

头文件的相互包含:

假如a.h包含了b.h,b.h有需要包含a.h,这种情况叫做头文件的相互包含,这种情况就会编译出错。
错误:未知类型名错误“xxx”,一般都是因为头文件相互包含导致的(还可能是复制文件时粗心,忘记改宏名)
解决方案:把a.h中需要的内容,和b.h中需要的内容提取出来,编写一个c.h
注意:头文件的相互包含和重复包含的区别

学习笔记15-C语言-预处理指令、条件编译、头文件相关推荐

  1. r导入txt乱码_R学习笔记系列—R语言从文本和Excel文件中读取数据-excel打开是乱码...

    1.4.1 从文本文件中导入数据 可以使用 read.table() 函数从带分隔符的文本文件中导入数.调用格式为: 这个函数看上去很复杂,但其实很多参数在使用时不用明确指出来,使用默认值可以满足绝大 ...

  2. C++语言学习笔记15:Clean 垃圾清理插件

    C++语言学习笔记15:Clean 垃圾清理插件 对话框 STET1 图片切换功能 导入位图资源 插入图片控件并修改属性 添加消息处理函数 step2 开发思路及类关系图 step3 添加控件及MFC ...

  3. c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...

    [[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...

  4. 游戏开发学习笔记——lua脚本语言——安装、汉化与小测试(解决lua运行代码乱码问题)

    游戏开发学习笔记--lua脚本语言--安装.汉化与小测试 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: Lua 是一种轻量小巧的脚本语言,用 ...

  5. 23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

    23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter 2016-07-22 (www.cnblogs.com/icmzn) 模式理解 1. Adapter 定义 ...

  6. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  7. Java快速入门学习笔记9 | Java语言中的方法

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  8. 23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory 2016-07-21 (www.cnblogs.com/icmzn) 模式理解   1. F ...

  9. C语言预处理指令大全

    C语言预处理指令 文章目录 C语言预处理指令 define 语法 Linux编译时指定宏的值及宏 删除已有的宏 C语言允许多参数的宏及宏函数 宏函数需要注意的事项 参数宏创建字符串 预处理粘合剂 li ...

  10. golang学习笔记之--Go语言内建容器

    话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...

最新文章

  1. android多屏幕适配资源生成,android – 多屏幕适配相关
  2. PTA数组作业一查找整数
  3. OpenCASCADE绘制测试线束:图形命令之AIS 查看器——查看命令
  4. 吴孟超:用一生为理想去奋斗 丨纪念吴孟超医生
  5. 小熊的人生回忆(二)
  6. leecode-11盛最多水的容器C版-双指针的使用
  7. python map用法_讲解Python map()函数和将map()与多个Iterables一起使用
  8. PostgreSQL 数据库检测到 ShareLock 死锁的处理方法
  9. web 前端签名插件_10款前端开发神器,助你成前端高手?
  10. 怎么把vivo强行刷入鸿蒙系统,vivo手机如何强制刷机
  11. linux c 开发 英文简历,软件工程师英文简历范文
  12. r5 4500u相当于英特尔什么级别 锐龙r54500u相当于i几
  13. 文件系统可视化与文件管理
  14. 小队pkc++_骑士小队2人金属第一印象
  15. 苹果语音备忘录怎么改名字_苹果手机语音备忘录怎么恢复?教你在手机上直接操作...
  16. Web微信小程序开发(一)
  17. 56.java编程思想——创建窗口和程序片 用户接口API
  18. SSM+教育培训管理系统 毕业设计-附源码141053
  19. ios设备微信公众号网页二次分享问题总结
  20. 公路中、边桩坐标计算及放样程序

热门文章

  1. 判断运营商_三大通信运营商步调一致,大流量互联网套餐陆续成绝版
  2. java用beaninfo_JavaBeanInfo 和 Spring 之间的关系
  3. 测试鼠标双击_鼠标环境可靠性测试是什么
  4. educoder平台_22个在线平台,2.4万门网课
  5. 与0xf2值相等的是python_腾讯笔试题涵盖的基础知识
  6. arcgis投影数据计算度分秒
  7. 【转】dicom网络通讯入门(2)
  8. 【转】日邮物流:实现智慧物流,这个云上对了!
  9. C#的变迁史04 - C# 4.0 之多线程篇
  10. [你必须知道的.NET] 第七回:品味类型---从通用类型系统开始