程序的预处理

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

  • 头文件的包含:#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 100int main() {int numbers[MAX];for (int i = 0; i < MAX; i++) {numbers[i] = i;}#ifdef DEBUGfor (int i = 0; i < MAX; i++) {printf("%d\n", numbers[i]);}#endifreturn 0;
}
gcc -E example.c >> example.i
cat example.i

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器公网带宽费用全解析(不同计费模式)

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…

集群监控原理

3.1.2.集群监控原理 Sentinel基于心跳机制监测服务状态&#xff0c;每隔1秒向集群的每个实例发送ping命令&#xff1a; •主观下线&#xff1a;如果某sentinel节点发现某实例未在规定时间响应&#xff0c;则认为该实例主观下线。 •客观下线&#xff1a;若超过指定数量&…

Qt 中的项目文件解析和命名规范

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…

2024蓝桥杯省赛保奖突击班-单调栈、模拟、简单dp_练习题解

P1449 后缀表达式 题目链接: P1449 参考思路&#xff1a; 如果遇到的字符是数字&#xff0c;则将连续的数字转成整数&#xff0c;并把操作数后面的"."过滤掉&#xff1b;如果遇到是字符是运算符&#xff0c;则取出操作数栈栈顶的两个元素进行计算&#xff0c;并把…

分享2024高校专业建设思路及建设效果

广东泰迪智能科技股份有限公司成立于2013年&#xff0c;是一家专业从事大数据、人工智能等数据智能技术研发、咨询和培训的高科技企业&#xff0c;公司基于十余年的数据智能产业实践经验&#xff0c;构建“产、岗、课、赛、证、文”融通的特色应用型人才培养模式&#xff0c;助…

Unity3D 打空包与远程资源更新详解

前言 在游戏开发过程中&#xff0c;打包和远程资源更新是非常重要的步骤&#xff0c;本文将详细介绍Unity3D中如何进行打空包和远程资源更新。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 一、打空包 …

蓝桥杯(填空题)

十四届 B组 日期统计&#xff08;暴力枚举&#xff09; 数据 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3…

深入理解Linux网络工具:netstat命令的高级应用

在Linux系统中&#xff0c;网络管理员经常需要监控和诊断网络连接问题。netstat命令是一个非常强大的工具&#xff0c;它可以显示系统上的网络连接、路由表、接口统计等信息。本文将深入探讨netstat命令的两个常用选项组合&#xff1a;-tlnp和-tnp&#xff0c;并解释它们的区别…

力扣 | 54. 螺旋矩阵

注意按照顺时针方向进行访问元素&#xff0c;以及每次触发的条件只会满足一个&#xff01; public List<Integer> spiralOrder(int [][] matrix){List<Integer> result new ArrayList<>();int m matrix.length;int n matrix[0].length;int row0,col 0;//…

构建第一个ArkTS之声明式UI描述

ArkTS以声明方式组合和扩展组件来描述应用程序的UI&#xff0c;同时还提供了基本的属性、事件和子组件配置方法&#xff0c;帮助开发者实现应用交互逻辑。 创建组件 根据组件构造方法的不同&#xff0c;创建组件包含有参数和无参数两种方式。 说明 创建组件时不需要new运算…

【4】c++多线程技术之高级线程同步技术

1、读写锁&#xff08;std::shared_mutex&#xff09;&#xff08;C17&#xff09; 读写锁&#xff08;std::shared_mutex&#xff09;是C17中引入的一种同步原语&#xff0c;用于允许多个线程同时读取共享数据&#xff0c;但在写入数据时只允许一个线程进行操作。这种锁可以提…

python毕业设计django游泳馆管理系统-flask

游泳馆管理系统具有信息管理功能的选择。游泳馆管理系统采用python技术&#xff0c;基于mysql开发&#xff0c;实现了首页&#xff0c;教练信息&#xff0c;培训信息&#xff0c;交流版块&#xff0c;活动公告&#xff0c;个人中心&#xff0c;后台管理等内容进行管理&#xff…

计算机毕业设计 工厂车间设备管理系统php+vue.js

该系统是以PHP为主要开发语言&#xff0c;集合MySQL数据库技术构建基于Web的以信息为目标的&#xff0c;动态的交互平台 PHP与Apache&#xff0c;MySQL的组合虽然有着诸多优势&#xff0c;但三种出自不同作者的开源软件要能很好的配合工作&#xff0c;需要很多手工配置&#x…

队列.....

假设以带头结点的循环链表表示队列&#xff0c;并且只设一个指针指向队尾结点&#xff0c;但不设头指针。试设计相应的入队和出队算法。 #include <stdio.h> #include <stdlib.h>#define ERROR -1 #define OK 0typedef int QElemType; // 假设队列中元素类型为 in…

WordPress JS Support Ticket插件 RCE漏洞复现

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。JS Support Ticket是使用在其中的一套开源票务系统插件。 0x02 漏洞概述 WordPress中的JS Support Ticket插件存在未经上传漏洞,未经身份验证的攻击者可以上传恶意脚本的服务器,执行任意指令,从而获…

【chatGPT】我:在Cadence Genus软件中,出现如下问题:......【4】

我 在Cadence Genus中&#xff0c;tcl代码为&#xff1a;foreach clk $clk_list{ set clkName [lindex $clk_list 0] set targetFreq [lindex $clk_list 1] set uncSynth [lindex $clk_list 4] set clkPeriod [lindex “%.3f” [expr 1 / $targetFreq]] … } 以上代码出现如下…

【JavaEE初阶系列】——网络编程 TCP客户端/服务器 程序实现

目录 &#x1f6a9;TCP流套接字编程 &#x1f36d;ServerSocket API &#x1f36d;Socket API &#x1f36d;TCP服务器 &#x1f36d;TCP客户端 &#x1f6a9;TCP流套接字编程 俩个关键的类 ServerSocket (给服务器使用的类&#xff0c;使用这个类来绑定端口号&#xff0…

设计模式:命令模式

命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 定义 命令模式包括以下主要角色&…

C语言程序与设计——工程项目开发

之前我们已经了解了C语言的基础知识部分&#xff0c;掌握这些之后&#xff0c;基本就可以开发一些小程序了。在开发时&#xff0c;就会出现合作的情况&#xff0c;C语言是如何协作开发的呢&#xff0c;将在这一篇文章进行演示。 工程项目开发 在开发过程中&#xff0c;你接到…

LeetCode 1. Two Sum

LeetCode 1. Two Sum 题目描述 给定一个整数数组 nums 和一个整数目标值 target ,请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 示例1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[0,1] 解释&…