IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 标准C语言基础知识12 -> 正文阅读

[C++知识库]标准C语言基础知识12

复习:
1、文件包含
? ? #include 把一个头文件导入到当前文件中
? ? ? ? #include <>
? ? ? ? #include ""
? ? ? ? 系统是通过环境变量指定头文件的加载路径
? ? ? ? 还可以通过编译参数 -I /path 指定头文件的加载路径
2、宏常量
? ? #define 宏名 字面值数据
? ? 如果在代码中使用了宏,在预处理时会把所有的宏替换为宏名后面的字面值数据
? ? 优点:提高代码可读性、提高可扩展性、提高安全性、还可以与case配合使用
? ? 注意:宏名一般全部大写,末尾不要加分号,不能直接换行(需要使用续行符 \ )
? ? ? ? 预定义的宏:
? ? ? ? ? ? __func__
? ? ? ? ? ? __FILE__
? ? ? ? ? ? __DATE__
? ? ? ? ? ? __TIME__
? ? ? ? ? ? __LINE__
? ? ? ??
3、宏函数
? ? #define FUNC(arg) arg*10
? ? 不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置
? ? 注意:可以使用续行符和大括号来保护代码
? ? 二义性:
? ? ? ? 由于宏所处位置或参数不同可能导致宏有多种解释,这就叫宏的二义性
? ? ? ? 可以在最外层加小括号,每个参数都加小括号,以此降低产生二义性的可能,不要在宏中使用自变运算符
? ? 运算符:
? ? ? ? # ? 把宏函数的参数变成字符串
? ? ? ? ## ?合并两个参数变成标识符

4、条件编译
? ? 根据条件决定代码是否参与最终的编译
? ? #if/#elif/#else/#ifdef/#ifndef/#endif
? ??
? ? 头文件卫士: ? ?防止头文件被重复包含
? ? #ifndef FILENAME_H
? ? #define FILENAME_H
? ? #endif//FILENAME_H

? ? 版本控制:
? ? ? ? #if VERSION >= 3
? ? ? ? #elif VERSION >=2
? ? ? ? #elif VERSION >=1
? ? ? ? #else
? ? ? ? #endif
? ? 编译器判断:
? ? ? ? #if __cplusplus
? ? ? ? ? ? //C++
? ? ? ? #else
? ? ? ? ? ? //C
? ? ? ? #endif
5、常考的笔试面试题:
? ? 定义一个宏表示100年有多少秒,忽略闰平年问题
? ? #define SEC (3600*24*365*100)u

? ? 在类型重定义时#define与typedef的区别?
? ? 是什么? ? ?#define是宏,typedef是类型限定符
? ? 有什么用? ? ?#define 宏名 类型,在使用宏时,代码中所有的宏都会替换成宏名后面的类型
? ? ? ? ? ? ? ? 在定义变量前加上typedef,变量名就等同于类型,常见的有sizeof time_t uint8_t... 都是使用typedef重新定义出来的
? ? ? ? ? ? ? ? 根本区别:#define是替换,而typedef不是替换

? ? 在定义常量时#define与const的区别?
? ? 是什么? ? ?#define是宏,const是类型限定符
? ? 有什么用? ? #define 宏名 常量,在 使用宏时,代码中所有的宏都会替换成宏名后面的常数
? ? ? ? ? ? ? ? 对已经初始化过的全局变量、静态局部变量用const修饰,会变常量text,不能修改

? ? 宏函数与普通函数区别?
? ? 是什么? ? ?宏函数不是真正的函数,是带参数的宏 ? 函数是一段具有某项功能的代码合集,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的命名空间、栈空间
? ? 有什么不一样? ? 宏函数:运行结果是表达式的计算结果,通用,相比较函数使用危险,没有传参只是替换,执行速度快,有冗余
? ? ? ? ? ? ? ? ? ? 函数:有返回值,类型检查,比较安全,入栈、出栈,执行时速度慢,需要跳转
? ? ? ? ? ? ? ? ? ??
? ? #define swap(a,b) {typeof(a) t=a;a=b;b=t;}

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

头文件的编写规则:
? ? 1、为每个.c文件写一份.h文件,.h文件是对.c文件的说明
? ? 2、如果需要使用某个.c文件中的变量、函数、宏、结构体...,只需要把该.c文件的.h文件导入即可使用
? ? 3、.c文件也要需要导入它的.h文件,目的是为了让声明与定义一致

头文件的相互包含:
? ? 假如a.h包含了b.h,b.h又包含a.h,这种情况就叫做头文件的相互包含,会导致编译错误

? ? 当确认变量、函数名已经定义且导入,但是依然报错:未定义 xxxx,先考虑是否头文件卫士写错,再考虑是否头文件相互包含

? ? 解决方法:从a.h中把需要用到的b.h内容提取出来,从b.h中把需要用到的a.h内容提取出来,放入新编写的c.h

Makefile
? ? Makefile是由一系列编译指令组成的可执行文本文件,也叫编译脚本
? ? 在终端执行make命令就会自动执行Makefile文件中的编译指令,它可以文件的修改时间来判断哪些文件需要编译,哪些文件不需要重新编译,根据依赖情况判断哪些文件先编译、哪些后编译,从而提高编译效率

? ? 编译规则:
? ? 1、如果这个项目没有编译过,则所有的.c文件都要编译并被链接成可执行程序
? ? 2、如果某几个.c文件被修改,则此次只编译修改过的.c文件并链接生成可执行程序
? ? 3、如果某个.h文件被修改,依赖该头文件的所有.c文件全部重新编译并链接

? ? 一个最简单的Makefile脚本:
? ? 执行目标:依赖?
? ? ? ? 编译指令
? ? 被依赖的目标1:依赖的文件
? ? ? ? 编译指令
? ? 被依赖的目标2:依赖的文件
? ? ? ? 编译指令 ? ?
? ? 被依赖的目标3:依赖的文件
? ? ? ? 编译指令
? ? ? ? ...
? ? clean:
? ? ? ? rm ...

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:26:28  更:2021-07-31 16:28:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/27 19:36:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码