程序的编译相关操作(C语言)

这篇具有很好参考价值的文章主要介绍了程序的编译相关操作(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

程序的编译相关操作(C语言),C语言,c语言,开发语言,程序编译

📜📜📜📜📜📜📜📜📜📜📜📜📜📜📜
📜📜📜📜📜📜秋已深📜📜📜📜📜📜📜
📜📜📜📜 📜📜 冬将至 📜📜📜📜📜📜
📜📜📜📜📜人间至此秋色尽📜📜📜📜📜
📜📜📜📜📜一世繁华一世荒📜📜📜📜📜
📜📜📜📜📜📜📜📜📜📜📜📜📜📜📜

📒程序环境

📑程序翻译环境

在这个环境中源代码被转换为可执行的机器指令。

程序的编译相关操作(C语言),C语言,c语言,开发语言,程序编译

📑程序执行环境

1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

2. 程序的执行便开始。接着便调用main函数。

3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。

4. 终止程序。正常终止main函数;也有可能是意外终止。

📒程序预处理

📑相关符号介绍

🗒️预定义符号

NULL:表示空指针,用于指示指针变量没有指向任何对象。

EOF:表示文件结束符,用于在文件输入时表示已经到达文件末尾。

sizeof:用于获取数据类型或变量所占用的内存空间大小。

const:用于声明常量,表示其值不可修改。

volatile:用于声明变量的值可能会在程序运行期间被意外修改。

signed:用于声明有符号类型的变量,可以表示正数和负数。

unsigned:用于声明无符号类型的变量,只能表示非负整数。

void:用于声明无类型类型的变量或函数,表示不返回任何值。

do-while:用于创建循环结构,先执行循环体,再判断循环条件。

for:用于创建循环结构,通常用于需要执行固定次数的循环操作。

if:用于条件判断,根据条件是否成立来执行不同的代码块。

switch:用于多分支条件判断,根据不同的条件执行不同的代码块。

while:用于循环结构,先判断循环条件,再执行循环体。

......

这些都是一些普通的预定义符号

__FILE__      //进行编译的源文件
__LINE__     //文件当前的行号
__DATE__    //文件被编译的日期
__TIME__    //文件被编译的时间
__STDC__    //如果编译器遵循ANSI C,其值为1,否则未定义

这些都是C语言内置的预定义符号。大家可以试着去编译下,看看效果,平常我们都很少用到。

🗒️#define定义标识符

在C语言中,#define是预处理指令,它用来定义标识符或常量。当你使用#define定义一个标识符时,编译器会将其替换为你在定义时指定的文本。例如,你可以使用#define定义一个常量:

#define PI 3.14159
//在这个例子中,当你使用PI时,编译器会将其替换为3.14159。
#define  max 100
//在这个例子中,当你使用PI时,编译器会将其替换为3.14159。

🗒️define定义宏

#define Add(x) ((x) * (x))
//在这个例子中,Add(x)会被替换为((x) * (x))。
//注意宏的参数在替换时需要用括号括起来,以避免因为运算符优先级产生的问题。
//例如,如果你不使用括号,Add(x + 2)会被展开为x + 2 * x + 2,而不是你预期的(x + 2) * (x + 2)。

需要注意的是,#define定义的标识符在预处理阶段就会被展开,而不会在运行时进行计算。因此,使用宏进行计算可能会影响程序的性能。

注意:

  1. 宏参数和#define 定义中可以出现其他#define定义的符号。但 是对于宏,不能出现递归。
  2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

📑宏和函数的对比

宏和函数在C语言中都用于实现代码的复用和简化,但它们在实现方式和用途上有一些不同。

执行方式:函数在程序运行时被调用,执行对应的代码块。宏在预处理阶段进行文本替换,不占用函数调用的时间和空间。

类型检查:函数具有强类型检查,编译器会检查函数参数类型和返回值类型。宏在替换时不会进行类型检查,容易出现错误。

安全性:函数是安全的,因为它们有参数类型检查和返回值。宏可能会出现错误或不安全的表达式。

调试:函数可以设置断点进行调试,而宏不能进行调试。

作用域:函数具有局部作用域,宏具有全局作用域。

性能:函数调用需要一定的开销,包括保存寄存器、栈操作等。宏替换没有这些开销,但可能会增加代码大小,降低运行速度。

使用场景:函数是可重用的代码块,通常用于封装复杂逻辑。宏通常用于替换简单的文本或常量,提高代码可读性。

在实际编程中,应根据具体需求选择使用宏还是函数。如果需要类型检查、安全性高或需要调试的代码块,应使用函数。如果需要替换简单的文本或常量,提高代码可读性,可以使用宏。

📑其它预处理命名

除了#define,C语言中还有其他一些预处理命名,包括:

#include:用于包含头文件,将头文件中的代码插入到程序中。

#ifndef、#define、#endif:用于防止头文件被重复包含。

#if、#elif、#else、#endif:用于条件编译,根据条件决定是否编译某段代码。

#warning:用于在编译时输出警告信息。

#error:用于在编译时输出错误信息。

#line:用于改变预处理器所报告的当前文件名和行号。

#pragma:用于改变编译器的特定设置。

这些预处理命名都是在编译阶段进行处理的,可以用来控制编译过程、生成特定代码或输出信息等。

程序的编译相关操作(C语言),C语言,c语言,开发语言,程序编译文章来源地址https://www.toymoban.com/news/detail-831816.html

到了这里,关于程序的编译相关操作(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言time库,时间和日期相关的操作方法

    用于处理时间、日期和时区的核心库。在实际开发中,常常需要与时间打交道,例如记录日志、处理时间差、计算时间间隔等等。因此,掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中,时间表示为time.Time类型,日期表示为time.Time类型或者time.Date类型,时区表示

    2024年02月14日
    浏览(41)
  • 【BOOST程序库】正则表达式相关操作

    基本概念这里不解释了,代码中详细解释了BOOST程序库中对于正则表达式常用方法的详细用法。

    2024年02月15日
    浏览(56)
  • ARM架构Linux操作系统上C语言版本的CycloneDDS中HelloWorld的编译过程(交叉编译工具链)

    ARM架构Linux操作系统上C语言版本的 CycloneDDS 中 HelloWorld 的编译过程与源码编译过程中的 roundtrip 示例编译是一样的,因为实在ARM架构上,所以需要将 idlc_generat e注释掉,自己手动添加源代码和头文件,之后在进行 cmake 和 make 操作

    2024年02月15日
    浏览(43)
  • 【编译原理】词法分析程序设计(C语言)

      给定下表所示的一个简单语言的词法规则描述完成以下任务: (1)画出识别该语言词法规则的 状态转换图 ; (2)依据状态转换图,设计并编制词法分析程序,实现从输入源程序中,识别出各类单词,即 、标识符、常数、运算符、界符 五大类,并输出各个单词

    2024年02月15日
    浏览(70)
  • 抖音小程序实现less语言编译样式

    2024年02月12日
    浏览(45)
  • Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序

    目录 一. 在Ubuntu系统下用c语言编写一个简单的输出hello world 的程序,并编译、运行。 1.1 gcc/g++简介 1.2 c++程序输出 Hello World: 1.3 c语言程序输出 Hello World: 二. 编写一个主程序文件main1.c和一个子程序文件sub1.c,实现函数间的调用 2.1  编写sub1.c 和main1.c 函数 2.1.1 编写sub1.c函数

    2024年02月04日
    浏览(51)
  • 【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )

    计算机 的 程序 是在 CPU 上执行的 , CPU 上执行的只有匹配该 CPU 的机器码指令 , 不同类型的 CPU 执行的 机器码指令 格式不同 , X86 和 ARM 执行的 机器码 指令格式是不同的 ; 机器码指令 是 二进制的 , 所有在 计算机 上执行的程序 , 都是 若干 二进制机器码 的集合 ; 计算机 只能执

    2024年03月22日
    浏览(47)
  • 编译原理1.6习题 程序设计语言基础

    图源:文心一言 编译原理习题整理~🥝🥝 作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡 第1版:自己的解题,与AI老师的判卷~🧩🧩 编辑: 梅头脑🌸  审核: 文心一言 题源: 龙书《编译原理》 Alfre

    2024年01月19日
    浏览(60)
  • 从头开发一个RISC-V的操作系统(三)编译与链接

    目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 这个系列的大部分文章和知识来自于:[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春,以及相关的github地址。 在这个过程中,这个系列相当于是我的学习笔记,做

    2024年04月09日
    浏览(52)
  • 后端开发有哪几种语言? - 易智编译EaseEditing

    后端开发是构建应用程序的一部分,负责处理服务器端的逻辑、数据库交互和数据处理。有许多编程语言可用于后端开发,以下是一些常见的后端开发语言: Java: Java是一种广泛使用的面向对象编程语言,具有强大的跨平台能力。在后端开发中,Java通常与Java EE(Java Platfor

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包