预处理过程(2/13)

  • 头文件包含:#include
  • 定义一个宏:#define
  • 条件编译:#if#else#endif
  • 编译控制:#pragma

编译器提供的这些预处理命令,大大方便了程序的编写:通过头文件包含可以实现模块化编程;使用宏可以定义一个常量,提高程序的可读性;通过条件编译可以让代码兼容不同的处理器架构和平台,以最大限度地复用公用代码。通过 #pragma 预处理命令可以设定编译器的状态,指示编译器完成一些特定的动作。

  • #pragma pack([n]):指示结构体和联合成员的对齐方式。
  • #pragma message("string"):在编译信息输出窗口打印自己的文本信息。
  • #pragma warning:有选择地改变编译器的警告信息行为。
  • #pragma once:在头文件中添加这条指令,可以防止头文件多次编译。

预处理过程,其实就是在编译源程序之前,先处理源文件中的各种预处理命令。编译器是不认识这些预处理指令的,在编译之前需要先把这些预处理命令处理掉。预处理主要包括以下操作:

  • 头文件展开:将 #include 包含的头文件内容展开到当前位置。
  • 宏展开:展开所有的宏定义,并删除 #define
  • 条件编译:根据宏定义条件,选择要参与编译的分支代码,其余的分支丢弃。
  • 删除注释。
  • 添加行号和文件名标识:编译过程中根据需要可以显示这些信息。
  • 保留 #pragma 命令:该命令会在程序编译时指示编译器执行一些特定行为。

使用如下命令仅执行预处理过程:arm-linux-gnueabi-gcc -E main.c > main.i

相关推荐
EleganceJiaBao16 天前
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
c语言·c++·预处理·宏定义·#pragma·#define·once
全能骑士涛锅锅17 天前
Advanced Macro Techniques in C/C++: `#`, `##`, and Variadic Macros
c语言·c++·预处理·宏定义
同志啊为人民服务!20 天前
深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接
汇编·预处理·链接·编译·汇编语言·高级语言·可执行文件装载过程
huangzhendong125 天前
C语言预处理详解
c语言·预处理
Amd7941 个月前
Nuxt.js 应用中的 webpack:done 事件钩子
ui·webpack·编译·nuxt.js·加载·清理·钩子
Amd7941 个月前
Nuxt.js 应用中的 webpack:error 事件钩子
webpack·编译·nuxt·错误·事件·处理·钩子
Amd7941 个月前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子
Amd7941 个月前
Nuxt.js 应用中的 webpack:compile 事件钩子
webpack·自定义·编译·nuxt.js·构建·钩子·逻辑
Amd7941 个月前
Nuxt.js 应用中的 vite:compiled 事件钩子
自定义·vite·编译·nuxt·热更新·性能·钩子
弗锐土豆1 个月前
maven工程修改jdk编译版本的几种方法
java·eclipse·maven·编译·版本