ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

程序的预处理中的核心知识点

2021-11-06 19:33:16  阅读:162  来源: 互联网

标签:__ 知识点 文件 代码 程序 编译 预处理 机器指令


首先简单介绍一下编译的过程~

1.编译:把.c变成一个exe文件

2.运行:把exe跑起来,执行里面的逻辑.

此处的"编译"是一个"广义"的编译,这个编译其实还可以再拆成很多个步骤.

(1)预处理:

编译器先对源代码进行一个初步的处理,会执行代码中的预处理指令,输入内容是.c文件,输出结果还是一个.c文件,在c语言中,以#开头的,都是预处理命令.

(2)编译(狭义的编译):

把c语言文件变成汇编语言的文件

(3).汇编:

把汇编语言的文件转换成二进制的机器指令.

(4).链接:

每个.c文件都会生成对应的机器指令文件,链接的过程就是把这若干个.c文件生成的结果合并起来

__FILE__ __LINE__最常用的场景就是在日志中打印

printf打印一个具体的日志时,加上__FILE__和__LINE__,就可以区分出当前打印函数的位置.

__DATE__和__TIME__表示编译时候的日期和时间.(和运行是没有关系)

__STDC__表示是否遵守c语言标准.如果遵守,结果就是1,不遵守,结果可能是0或者未定义. 

通过#define可以做到很多事情~

1.定义常量

2.给类型定义别名

3.自定义一些"关键字"

4.通过宏作为一些"编译开关"

5.定义一个代码片段(让宏看起来像一个函数一样)

所谓的宏,本质上就是一个"文本替换"

宏的优势:

1.参数可以是任意类型,写一个代码就可以针对多个情况来使用.

2.避免了函数调用传参的开销,这个操作的速度就要比函数调用更高效. 

宏的劣势:

1.宏展开后容易出现不预期的效果

2.使用宏,非常不方便调试,尤其宏比较复杂的时候,也不方便阅读.

3.宏无法递归

4.宏没有参数检查 

宏建议一般能不用就不用.

条件编译也是一种预处理指令,例如#if,#else,#endif,#ifdef,#ifndef.

就是满足条件,编译一部分代码,不满足条件,在编译另一部分代码

典型应用一:一份代码,同时兼容开发环境和发布环境~

在开发的时候可能会有很多"调试代码",如果在发布的时候一行一行删掉,风险太大,可能会漏删,也可能会误删.

典型应用二:一份代码兼容不同的系统~

写代码考虑到跨"平台",一份代码要支持不同的操作系统

典型应用三:防止头文件被重复包含~ 

#pragma once

标签:__,知识点,文件,代码,程序,编译,预处理,机器指令
来源: https://blog.csdn.net/qq_52637200/article/details/121182663

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有