当前位置:网站首页>Standard C language learning summary 11
Standard C language learning summary 11
2022-08-03 19:10:00 【c7473168】
一,预处理指令
程序员所编写的代码不是真正的标准C代码,需要一段程序翻译成标准C代码,
才能被编译器编译
翻译的过程叫做预处理,负责翻译的程序叫做预处理器,
被翻译的语句叫做预处理指令,以#开头的都是预处理指令
gcc -E code.c 直接显示预处理后的结果
gcc -E code.c -o code.i 生成预处理文件
二,预处理指令的分类
#include 导入头文件/头文件包含
#include <> Find and import header files directly from the system-specified path
#include "" First search from the current working path,找不到再从系统指定路径查找并导入头文件
gcc code.c -I path
编译时指定头文件的加载路径为path,最先从该路径查找
可以通过设置环境变量来修改,增加系统指定头文件加载路径
修改~/.bashrc 终端配置文件
#define 定义宏
宏常量:#define 宏名 常量值
#define MAX 100
其实本质上就是,Where the macro name appears in the code, it is replaced by
对应的常量值
优点:提高代码可扩展性,提高了可读性,提高了安全性,还可以用在case后面
注意:一般宏名全部大写,末尾不要加分号
局部变量,函数名全部小写,全局变量首字母大写,数组arr,指针p
二级指针pp 字符串str
预定义好的宏:
__func__ 获取函数名
__FILE__ 获取文件名
__DATE__ 获取当前日期
__TIME__ 获取当前时间
__LINE__ 获取当前行数 The above are all strings. This is%d
宏函数:其实就是带参数的宏
#define 宏名(参数名) 替换的内容,代码
宏函数不是真正的函数,不检查参数类型,没有传参,
只有表达式的计算结果没有返回值
#define SUM(a,b) a+b
替换过程:
1,先把代码中使用到宏函数的地方替换为宏函数后面的代码 a+b
2,再把宏函数代码中使用到的参数替换为调用者提供的数据 num1+num2
注意:宏函数后面的替换代码不能直接换行,The end of each line needs to be used
通过续行符\来换行
如果有多行代码,可以使用大括号保护代码
宏的二义性:
由于宏代码所处位置,参数位置,优先级问题,
leading to different interpretable results for the same what else can be done
如何避免宏的二义性:
1,给每个参数加小括号,给整个式子加小括号
2,在使用宏函数时,不要提供带自变运算符的参数
注意:容易出选择题
"Common written test interview questions:
#define 与 typedef 的区别?
#define INT int 宏定义
typedef int INT; 类型重定义
INT num;
如果是普通类型,There is no functional difference between them
#define INTP int*
typedef int* INTPP;
INTP p1,p2,p3; //p1是int* p2 p3 是int
INTPP p1,p2,p3; //p1,p2,p3都是int*
宏函数与普通函数的区别?
它们是什么?
宏函数:Macro substitution with arguments,Just code replacement,Just use it like a function,
不是真正的函数
函数:Is a collection of code that has a function,Will be translated into binary instructions to store code segments
函数名就是它的首地址,There is a separate stack memory,命名空间
有什么不一样:
函数: 返回值 类型检查 安全 内存申请,释放 速度慢 函数跳转
宏函数: 运算结果 通用 危险 替换 速度快 代码冗余
注意:调用频繁,Simple functions are suitable for writing macro functions
"
条件编译
根据条件决定哪些代码是否参与最终的编译
版本控制:
#if 条件
#elif 条件
#else
#endif
头文件卫士:
防止头文件被'重复'包含
#ifndef 宏名
#define 宏名
#endif/*宏名*/
宏名:头文件名全部大写,The decimal point is underlined_代替
注意:头文件中必加头文件卫士
调试,判断:
#ifdef 宏名(DEBUG)
如果宏名定义了,则此处代码参与编译
#else
否则,此处参与编译
#endif
gcc code.c -D宏名
可以在编译时定义宏
定义打印调试信息宏函数,是否打印提示信息,取决于是否定义了DEBUG宏
#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__)
三,头文件
头文件中应该写什么?
问题:头文件可能会被任意的源文件包含,means that the content in the header file will
Exist in multiple object files simultaneously,因此要满足合并内容不能有冲突
重点:Only declaration statements can be written in header files,绝对不能有定义语句
函数声明
全局变量声明
宏常量
宏函数
typedef 类型重定义
结构,联合,枚举的类型声明
头文件的编写原则:
1,为每个.cWrite a document.h文件,.h文件对.c文件的说明
2,如果需要用到某个.c文件中的全局变量,函数,宏等内容时,
只需要把它的头文件导入即可
3,.cThe file also imports its own.h文件,The intent is for declarations to be consistent with definitions
头文件的相互包含:
假设a.h包含了b.h, b.h又包含了a.h此时编译会出错
解决方案:把a.h需要导入b.h的内容和b.h需要导入a.h的内容提取出来
到另一个c.h
错误提示:location type name"xxxx",大概率就是头文件相互包含
边栏推荐
- Power button brush the topic of merging two orderly array
- LeetCode 622. 设计循环队列
- ctfshow php features
- 基于ck+redash构建MySQL慢日志+审计日志展示平台
- 关于2022年度深圳市技术攻关重大项目的申报通知
- pg_memory_barrier_impl in Postgresql and C's volatile
- 分享即时通讯开发之WebSocket:概念、原理、易错常识、动手实践
- MVC vs MVP
- MySQL详细学习教程(建议收藏)
- 【C语言学习笔记(六)】分支与跳转(if、else、continue、break、switch)
猜你喜欢
随机推荐
LOL英雄联盟卡顿掉帧问题解决办法 2022年8月1日
[Notes] Introduction to machine learning
Rust:多线程并发编程
pytest接口自动化测试框架 | 基于Pytest的Web UI自动化测试框架介绍
ROS仿真环境搭建
普通用户如何利用小红书赚钱呢?小红书的流量是真的吗?
Web项目Controller统一返回实体类
不要小看 WebSocket!长连接、有状态、双向、全双工都是王炸技能
POJ 3041 Asteroids(最大匹配数=最小点覆盖)
力扣刷题之有效的正方形(每日一题7/29)
OneNote 教程,如何在 OneNote 中设置页面格式?
PreFixSum前缀和
The effective square of the test (one question of the day 7/29)
Confused!Ali was abused on the one hand, but was fortunate to be promoted to Huawei's technology, and successfully got the offer, with an annual salary of 40w
基于移动GIS的环保生态管理系统
typescript学习笔记
Solution for no navigation bar after Word is saved as PDF
基于ck+redash构建MySQL慢日志+审计日志展示平台
[Azure Event Hub] Create Event Hub Consume Client + Custom Event Position with Azure AD Authentication
读取 resources 目录下的文件路径的九种方式,你知道多少?








