C | 在ubuntu22下开发的一些配置

server/2024/9/25 23:17:48/

目录

VScode设置

要下载的插件:

卸载VScode的话就是哪装的哪删。

浅用gcc

预处理指令

使用gcc

语言编译过程

1. 预处理(Preprocessing)

2. 编译(Compilation)

3. 汇编(Assembly)

4. 链接(Linking)


VScode设置

其一开始如果没有进行额外的设置,默认编译C文件的时候只编译当前这个文件,即 ${file} ,这样会造成引用错误。

所以得修改参数:

把${file}注释掉,写成

"*.c"

这表示会编译当前项目目录下的所有.c文件。

保存后再运行文件就不会报错了。例如:

要下载的插件:

卸载VScode的话就是哪装的哪删。

浅用gcc

Linux 的C语言开发,一般选择 GCC 工具链进行编译。

在VScode里直接输入main+回车:

int main(int argc, char const *argv[])
{/* code */return 0;
}

其中,int argc是传入的参数个数, char const *argv[] 是接受传入的参数而形成的数组指针。

这两个参数可以先不用,删去就行。

预处理指令

在C语言中,#ifndef 是一个预处理指令,用于防止头文件被重复包含。它的全称是 "Not Defined If Not",即“如果未定义,则不包含”。这通常用于防止头文件被多次包含,这可能会引起编译错误或运行时错误。

这里是一个使用 #ifndef 的典型例子:

#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H// 头文件的内容#endif // HEADER_FILE_NAME_H

这段代码的工作原理如下:

  1. #ifndef HEADER_FILE_NAME_H 检查是否已经定义了 HEADER_FILE_NAME_H 这个宏。如果没有定义,编译器会继续执行下面的代码。
  2. #define HEADER_FILE_NAME_H 定义了 HEADER_FILE_NAME_H 这个宏,确保如果再次遇到这个头文件,#ifndef 检查会失败,从而防止代码被再次包含。
  3. 头文件的内容放置在 #ifndef#endif 之间。
  4. #endif 表示 #ifndef 指令的结束。

使用这种技术可以确保头文件中的内容只被编译一次,即使在多个源文件中包含了同一个头文件。这是一种常见的做法,用于避免全局变量和函数的重复定义问题。

使用gcc

gcc 所有要编译的文件 -o 编译完输出的程序名

这是gcc最简单的使用过程,省略了中间过程。

语言编译过程

语言编译过程是将源代码转换成机器可以执行的指令的一系列步骤。这个过程通常包括以下几个阶段:

1. 预处理(Preprocessing)


   - 预处理器处理源代码文件中的预处理指令,如宏定义(`#define`)、文件包含(`#include`)等。

2. 编译(Compilation)


   - 编译器将预处理后的源代码转换成中间代码或目标代码。对于C语言,这通常是一个汇编语言形式的中间代码。

3. 汇编(Assembly)


   - 汇编器将汇编语言转换成机器码。这一步对于高级语言来说可能是编译器的一部分,直接生成机器码。

4. 链接(Linking)


   - 链接器将编译后的各个模块(比如由多个源文件编译生成的多个目标文件)合并成一个可执行文件。链接器还会处理外部库和函数调用。

最终生成的程序占内存大小和使用的链接方式有关。

-static :该参数指示编译器进行静态链接,而不是默认的动态链接。使用这个参数,GCC会尝试将所有用到的库函数直接链接到最终生成的可执行文件中,包括C标准库(libc)、数学库(libm)和其他任何通过代码引用的外部库。

5. 优化(Optimization)
   - 在编译和/或链接阶段,编译器可能会对代码进行优化以提高执行效率或减小生成的代码大小。

6. 代码生成(Code Generation)
   - 编译器生成可执行的机器代码。

7. 加载(Loading)
   - 加载器将编译生成的可执行文件加载到内存中,并为程序的执行准备环境。

8. 执行(Execution)
   - 程序开始运行,CPU执行加载到内存中的机器代码。

这个过程可能会根据使用的编程语言和编译器的不同而有所变化。例如,一些语言(如Java和C#)使用中间字节码,需要一个虚拟机来执行这些字节码。另外,一些现代编译器可能会将多个阶段合并或以不同的顺序执行这些步骤。

对于不同的编程语言,编译过程可能还包括其他步骤,比如垃圾收集、类型检查等。

本文需要改进的部分:

  1. 语言编译过程那部分,每部分都要补充对应的gcc命令。


http://www.ppmy.cn/server/49322.html

相关文章

Element-UI - 解决el-table中图片悬浮被遮挡问题

在开发中,发现element-ui在el-table中添加图片悬浮显示时,会被单元格遮挡的问题。通过查询得到的解决办法,大多是修改.el-table类中相关样式属性,但经过验证发现会影响到其他正常功能的使用。对于此问题解决其实也并不难&#xff…

存储器的性能指标以及层次化存储器

存储器的性能指标 存储器有三个性能指标:速度、容量和位价(每位价格) 1.存储速度 (1)存取时间 想衡量存储速度,最直观的指标就是完成一次存储器读写操作所需要的时间,这叫做存取时间&#x…

从局部到全局:产品开发视角的转变与系统优化策略

一、研发背景 在科技产品开发领域,每一种产品都存在着多元化的开发方案可供选择,这要求开发者不断拓展视野,进行横向对比学习,以期找到最贴合市场需求、最具竞争优势的解决方案。以往,我们的研发团队一直立足于稳固而…

.net8 blazor auto模式很爽(五)读取sqlite并显示(2)

在BlazorApp1增加文件夹data&#xff0c;里面增加类dbcont using SharedLibrary.Models; using System.Collections.Generic; using Microsoft.EntityFrameworkCore;namespace BlazorApp1.data {public class dbcont : DbContext{public dbcont(DbContextOptions<dbcont>…

手机照片免费数据恢复软件EasyRecovery2024免费版下载

大家好&#xff01;今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道&#xff0c;电脑中的重要文件一旦丢失&#xff0c;对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器&#xff01;它能够帮助我们快速、有效地恢…

Shell中[ ],[[ ]]的区别

在Shell编程中&#xff0c;[ ] 和 [[ ]] 是两种常用的条件测试结构&#xff0c;用于在脚本中执行逻辑判断。尽管它们看起来相似&#xff0c;但功能和使用场景却有显著差异。理解这两者的区别及其应用场景&#xff0c;对于编写高效、健壮的Shell脚本至关重要。本文将详细介绍 [ …

大数据-Hadoop-基础篇-第四章-MapReduce (离线计算引擎)

目录 参考概念设计思想工作原理计算流程切片机制 程序WordCount执行流程求平均值 参考 经典大数据开发实战&#xff08;Hadoop &HDFS&Hive&Hbase&Kafka&Flume&Storm&Elasticsearch&Spark&#xff09; 概念 MapReduce 常用于对大规模数据集(…

vue3轮播图怎么做

先看效果 实现代码 <n-carouseleffect"card"dot-type"line"draggable:autoplay"!isHovered":current-index"currentIndex"prev-slide-style"transform: translateX(-150%) translateZ(-450px);opacity:1"next-slide-st…