编译原理之预处理

news2024/11/15 19:29:41

目录

生成预处理文件的的命令

预处理做了什么

实验


---------------------------------------------------------------------------------------------------------------------------------

本篇文章主要是带着大家一起看看预处理阶段编译器都做了些什么

---------------------------------------------------------------------------------------------------------------------------------

预处理_哔哩哔哩_bilibili

生成预处理文件的的命令

gcc -E test.c -o test.i

预处理做了什么

头文件包含:将#include指令指定的头文件内容插入到源代码中。这有助于实现代码的重用和模块化。
宏定义替换:将#define定义的宏在代码中进行替换。这有助于简化代码和提高代码的可读性。
条件编译:根据条件编译指令(如#ifdef、#ifndef、#endif)选择性地编译代码的一部分。这有助于在不同的编译环境下编译出不同的版本。

实验

# 0 "test.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "test.c"
int main()
{
    return 0;
}

上面就是一个简单的c语言预处理后的样子

上面的那一段信息是给编译器看的包括名字、命令、隐形包含的头文件stdc-predef.h

stdc-predef.h 这个头文件之所以会被包含,主要是因为它是编译器(如 GCC)在预处理阶段自动插入的一个内部头文件,用于定义一些预处理器宏和类型定义,这些定义通常是与编译器和平台相关的。这个头文件并不是用户直接编写的,也不是用户需要显式包含的,而是由编译器在编译过程中根据需要自动处理的。

具体来说,stdc-predef.h 可能包含以下类型的定义:

  1. 预处理器宏:这些宏可能用于标识编译器的版本、目标平台、操作系统等。例如,可能包含定义编译器名称、版本号的宏,或者定义目标平台特性的宏(如是否支持特定类型的内存模型或指令集)。

  2. 类型定义:虽然 stdc-predef.h 通常不直接定义用户可见的类型(这些类型通常由标准库头文件如 <stddef.h><stdint.h> 等定义),但它可能包含一些与编译器内部实现相关的类型定义,这些类型在编译器的内部表示中使用。

  3. 平台特定的宏:这些宏可能用于条件编译,以便在不同的平台上编译相同的代码时能够包含或排除特定的代码段。

需要注意的是,由于 stdc-predef.h 是编译器内部使用的头文件,因此其内容和行为可能会随着编译器的不同版本和配置而有所变化。用户通常不需要关心这个头文件的具体内容,因为它是由编译器自动处理的。

在查看预处理后的 .i 文件时,可能会看到类似 # 1 "/usr/include/stdc-predef.h" 的行,这表示编译器在预处理阶段自动插入了 stdc-predef.h 头文件的内容。这是编译器内部机制的一部分,用于确保编译过程能够正确地处理与编译器和平台相关的定义。

创建个头文件

int def1 = 0;
int def2 = 1;
char s[10] = {"Hello!"};
# 0 "test.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "test.c"
# 1 "test.h" 1
int def1 = 0;
int def2 = 1;
char s[10] = {"Hello!"};
# 2 "test.c" 2
# 11 "test.c"
int main()
{
 int a,c,b,d,e,f,g;
 a = 1;
 b = 1;
 c = 1;
 d = 1;
 e = 1;
 f = 1;
 g = 1;
    return 0;
}

也就是说出了我们主动包含的头文件,编译器还会自动包含一些头文件

比如这个程序我忘记包含stdio.h了但是仍然可以打印出来

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

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

相关文章

多线程1(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #include <process.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, …

react hooks--概述

前言 ◼ Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 ◼ 我们先来思考一下class组件相对于函数式组件有什么优势&#xff1f;比较常见的是下面的优势&#xff1a; ◼ …

软件测试学习笔记丨Docker 安装、管理、搭建服务

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32192 容器&#xff08;Docker&#xff09;技术的价值 保证环境一致性&#xff0c;只要使用相同镜像部署就可以保证一致性。轻量级虚拟化访问&#xff0c;运行更快&#xff0c;资源更小。同时…

通用与专用LabVIEW软件版本对比

在LabVIEW开发过程中&#xff0c;通常会根据项目需求设计出通用版本和专用版本两类软件。通用版本适合广泛的测试场合&#xff0c;具有较强的扩展性和适用性&#xff0c;而专用版本则针对特定设备或功能进行定制&#xff0c;提供更高的精确度和效率。两者各有优势&#xff0c;开…

《SpringBoot+Vue》Chapter01_SpringBoot介绍

SpringBoot的介绍 简单来说&#xff0c;SpringBoot就是Spring提供的用于Web开发的脚手架框架。配置简单、上手快速 SpringBoot的特性 自带tomcat、Jetty服务器可以部署war包自动配置Spring框架和第三方框架能够提供应用的健康监控和配置的监控没有代码生成&#xff0c;并且尽可…

新能源汽车充电基础设施大爆发

新能源汽车充电基础设施迈入新阶段&#xff1a;全国总量破千万&#xff0c;未来五年将翻番增长 截至2024年7月底&#xff0c;全国充电设施总量已达到1060万台&#xff0c;为超过2500万辆新能源汽车提供了充电服务。目前&#xff0c;95%的高速公路服务区已具备充电功能&#xf…

OPENAIGC开发者大赛企业组钻石奖 | FilmAction — AI电影创作平台

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给您…

算法练习题27——疫情下的电影院(模拟)

其实思路还好 就是输入有点难搞 Java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input scanner.nextLine();// 去掉输入字符串的方括号if (input.…

从大脑图谱/ROI中提取BOLD信号

动机 在功能连接&#xff08;Functional Connectivity&#xff0c;FC&#xff09;构建过程中&#xff0c;由于FC中元素数目是节点数目的平方关系&#xff0c;所以在计算FC之前进行数据降维是一个常见的选择。 一般会将体素级/顶点级BOLD信号&#xff08;在2mm的图像分辨率下大脑…

Python实现一个轮盘抽奖功能(完整代码)

运行后代码图片 python的gui模块 python常用的图形库tkinter、wxpython、pyqt。 tkinter是python自带的图形库&#xff0c;Tkinter 可以在大多数的 Unix 平台下使用&#xff0c;同样可以应用在 Windows 和 Macintosh 系统里。 wxPython 是一款开源软件&#xff0c;是 Python…

C++进阶:多态

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态。 编译时多态(静态多态)主…

一口气学完docker【入门到精通】

一、容器 1、什么是容器 容器是一种轻量级的虚拟化技术&#xff0c;它为应用程序提供了一种隔离的运行环境。在操作系统级别上实现&#xff0c;容器将应用程序及其所有依赖项&#xff08;包括库、配置文件等&#xff09;封装在一起&#xff0c;形成一个独立的标准单元。 每个…

[数据结构]二叉搜索树

今天我们来学习一下新的数据结构&#xff0c;二叉搜索树&#xff0c;这个结构比较简单&#xff0c;是一个铺垫式的结构&#xff0c;为之后的平衡二叉树&#xff0c;AVL树以及红黑树做一个知识基础&#xff0c;我们将从概念到实现具体的介绍二叉搜索树。 目录 Ⅰ.二叉搜索树的…

比亚迪电动汽车的市场占比太惊人

比亚迪&#xff08;BYD&#xff09;在中国电动汽车市场的崛起无疑是近年来最显著的现象之一。凭借其强大的技术整合、丰富的产品线以及价格优势&#xff0c;比亚迪已经迅速成为中国乃至全球电动汽车领域的领导者。在2024年&#xff0c;比亚迪的市场份额在中国汽车市场达到了惊人…

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源&#xff0c;作用&#xff1a;1.使IO口的不确定电平稳定在高点平&#xff0c;2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连&#xff0c;作用&#xff1a;1.从器件输出电流 2.当IO口为输入状态时&#xff0c;引脚的…

Redhat 8,9系(复刻系列) 一键部署Oracle23ai rpm

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

适合学生党开学买的蓝牙耳机?分享开放式耳机排行榜前十名

学生党开学想买耳机的话&#xff0c;我觉得比较适合入手开放式耳机&#xff0c;因为这类耳机佩戴舒适度高&#xff0c;长时间使用也不会感到不适或疲劳&#xff0c;同时保持耳道干爽透气&#xff0c;更加健康卫生&#xff0c;还能提供自然、开阔的音场&#xff0c;音质表现优秀…

详解c++多态---上

virtual关键字 1.可以修饰原函数&#xff0c;为了完成虚函数的重写&#xff0c;满足多态的条件之一。 class Person { public:virtual void BuyTicket() { cout << "买票-全价" << endl; } };class Student : public Person { public:virtual void Buy…

NarratoAI利用AI大模型,一键解说并剪辑视频

测试视频: 字幕/配乐后期添加的,视频由NarratoAI自动生成的 雪迷宫-NarratoAI利用AI大模型剪辑解说视频测试 WIN整合包 下载链接&#xff1a;https://pan.quark.cn/s/8f54ef99e3fb 使用前先更新&#xff0c;运行update.bat Gemini API Key 访问 https://aistudio.google.c…