程序的预处理

本文详细介绍了C语言编译器中的预处理命令,如头文件包含、宏定义、条件编译和pragma,以及预处理过程如何影响源程序结构,展示了预处理前后源文件的变化。
摘要由CSDN通过智能技术生成

为了方便编程,编译器一般为开发人员提供一些预处理命令,使用#标识。我们常见的预处理命令如下。

  • 头文件的包含:#include.
  • 定义一些宏#define
  • 件编译:#if、#else、#endif。
  • 编译控制:#pragma。

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

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

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

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

一个源程序在预处理前后有什么变化呢?我们写了一个测试程序,分别使用预处理命令去定义一些宏和条件编译。

// example.c
#include <stdio.h>

#define MAX 100

int main() {
    int numbers[MAX];
    for (int i = 0; i < MAX; i++) {
        numbers[i] = i;
    }

    #ifdef DEBUG
    for (int i = 0; i < MAX; i++) {
        printf("%d\n", numbers[i]);
    }
    #endif

    return 0;
}
gcc -E example.c >> example.i
cat example.i

自己可示例分析 查看example.i 文件.

通过预处理前后源文件的变化对比,不难发现:当预处理器遇到#include命令时,会直接将包含的头文件内容展开,并删除#include;当遇到#define宏时,执行同样的操作。当遇到条件编译指令时,会根据开发者定义的宏标记,选择要参与编译的代码部分,其余部分删除,经过预处理后,#pragma保留,指示编译器在后续的编译阶段执行一些特定的操作。继续编译预处理后的C程序,在编译信息提示窗口里,我们会看到自己添加的编译提示信息。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值