前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >预处理机制

预处理机制

作者头像
WuShF
发布2023-11-24 10:32:51
1100
发布2023-11-24 10:32:51
举报
文章被收录于专栏:笔记分享笔记分享

预处理类别

宏定义:#define

  • 将文本替换为表达式或语句

条件编译:#ifdef#ifndef#if#elif#endif

  • 根据标识符是否被定义选择编译代码

头文件包含:#include

  • 将其他文件(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义的内容

预处理流程

  1. 预处理指令识别
  2. 宏替换
  3. 条件编译
  4. 头文件包含
  5. 行连接处理
  6. 宏展开和条件编译的递归处理

预处理指令识别

扫描源代码并识别以#开头的预处理指令。

宏替换

预处理器根据宏定义将代码中的宏名称替换为指定的文本。 可以是常量替换,也可以是带参数的宏函数替换 预处理器会根据宏定义展开宏

条件编译

根据条件选择性地编译不同的代码块。 #ifdef#ifndef#if#elif#endif

头文件包含

通过#include指令,将其他文件(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义的内容

预处理的行连接处理

在C语言中,行连接处理是预处理阶段的一部分,用于将一行代码书写为多行,以保持代码可读性。 行连接操作通过反斜杠\字符实现。一行代码以反斜杠字符结尾时,该行代码将与下一行自动连接为一行。

image.png
image.png

换行之后的进位也会被当作空格输出出来。 行连接在预处理阶段,在编译阶段看到代码时,已经是连接在一起的一行。这种处理不会影响编译器的语义分析和中间代码。

宏展开和条件编译的递归处理

在进行宏展开和条件编译时,如果遇到新的预处理指令,预处理器会递归地处理这些指令。肯呢个会触发更多的宏展开和条件编译。

删除注释

预处理器将源代码中的注释删除,注释在预处理阶段无需保留,不会影响编译器的输出。

预编译的警告信息和错误信息

可以使用#error#warning预处理指令来生成编译错误和警告信息。这些指令在预处理时发出特定的错误或警告信息,让开发者知道代码中存在的问题或需要注意的地方

image.png
image.png

#error#warning指令生成的信息只会在预处理阶段发出,而不会影响到最终的目标代码,它们在编译阶段不会生成任何错误或警告信息。

image.png
image.png

查看预处理后的源文件

以肯哥用的GCC为例。 可以使用-E选项来查看预处理后的源文件。只进行预处理操作,不进行编译、汇编和链接。将预处理后的源文件输出到标准输出流,一般是控制台。 gcc -E example.c 编译器会将预处理后的内容输出到控制台。 如果你想将预处理后的源文件保存到一个文件中,可以使用重定向操作符>将输出重定向到一个文件中。 gcc -E example.c > preprocessed.c 上述命令会将预处理后的源文件保存到名为preprocessed.c的文件中。

重点强调

  • 宏定义的命名规范
  • 宏定义与函数调用的冲突
  • #include不单单是只能包含头文件:include的本质就是纯文本包含。
  • 善用条件编译:在庞大工程代码的配置裁剪工作中,绝大多数的技术手段就是利用条件编译,对不同的代码选用和删除,达到代码裁剪的效果。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 预处理类别
  • 预处理流程
  • 查看预处理后的源文件
  • 重点强调
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档