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

目录

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命令。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最长回文子串问题详解

最长回文子串的问题描述:给出一个字符串S,求S的最长回文子串的长度。 针对这个问题,先看暴力解法:枚举子串的两个端点i和j,判断在[i,j]区间内的子串是否回文。从复杂度上来看,枚举端点需要,判断…

Linux、Windows安全加固

为了减少系统被黑客入侵,对操作系统的安全加固是网络安全和主机安全必不可少的一部分。 一、Linux安全加固 1.不使用默认的ssh端口,修改默认ssh22端口号 sudo vim /etc/ssh/ssh_config 去掉#注释,修改端口号并保存 2.关闭不必要的系统服务…

芯片验证分享8 —— 代码审查2

大家好,我是谷公子,上节课给大家讲了代码审查中的代码正向检查,今天我们来讲代码审查的其他方法。 今天介绍的检查方法有: 代码反向检查 桌面检查 同行评审 可用性验证 这些验证方法可以应用在芯片开发的任何阶段。代码审查…

vitepress搭建的博客系统cdn引入github discussions评论系统

github仓库必须是公开的。 按照CDN的方式引入 打开discussions模块 安装giscus app 配置giscus 就是刚安装了giscus app的仓库 页面往下走,生成了代码: 配置vitepress 采用了CDN的方式引入 使用web component 随便找个地方试试组件 效果 有了…

Windows 托盘图标实现类封装及使用(附源码)

在系统桌面右下角的托盘区域,创建一个托盘图标,已经是很多软件的标配了,特别是IM即时通讯软件,要在托盘图标上显示来消息时的闪动头像。 其实托盘图标创建很简单,使用起来也比较方便,主要是调用Shell_NotifyIcon API函数,传入不同参数表示对应的操作: 1)NIM_AD…

ROS创建一个软件包

 首先, 配置您的 ROS 2 安装环境。 让我们使用您在 先前教程 中创建的工作空间 ros2_ws 来创建您的新软件包。 在运行软件包创建命令之前,请确保您位于 src 文件夹中。 LinuxmacOSWindows cd ~/ros2_ws/src在ROS 2中创建新包的命令语法如下&#…

R进阶使用技巧

Introduction 分享一些R进阶使用的技巧,相当于是之前写的R语言学习的实践和总结了。 Online slide: https://asa-blog.netlify.app/R_tips_for_advanced_use_byAsa/R_tips.html 下载slide和相关的各种test文件: https://asa-blog.netlify.app/R_tips_for_advanced…

会声会影2024一共新增了8项功能

会声会影2024一共新增了8项功能。 一、语音转文字视频中语音能自动转换成文本,节省手动创建字幕时间!会声会影2022可以捕获视频中的字幕,并将它应用到任何地方。这个功能是我觉得本次更新中最强大的,再也不需要为手动输入字幕发愁…

以太网基础知识(二)—NRZ,PAM4调制技术

1:码元 了解调制技术需要引出“码元”的概念。 一个码元就是一个脉冲信号,即一个最小信号周期内的信号,我们都能够理解,最简单的电路,以高电平代表1,低电平代表0,一个代表1或者0的信号&#x…

关于QTcreator,19年大学时写的文章了,之前写在印象笔记现在拉过来,往事如烟呐

1.初来乍到,先按照书本写一个基础列程理解一下原理。 这里创建工程的时候选择Qdialog基类,dialog.h头文件,并且勾选了创建界面 (勾选之后可以通过手动添加组块并且可以自生成他们的函数定义,如果没有勾选,…

纽约华尔街Wall Street 简介

中文版 华尔街简介 华尔街位于纽约市曼哈顿下城,是全球最重要的金融中心之一。它代表了美国的金融市场,并且是许多重要金融机构的所在地。以下是对华尔街的概述: Source: Google Map 历史背景 起源:"华尔街"这个名字…

springboot + Vue前后端项目(第十六记)

项目实战第十六记 写在前面1 第一个bug1.1 完整的Role.vue 2 第二个bug2.1 修改路由router下面的index.js 总结写在最后 写在前面 发现bug&#xff0c;修复bug 1 第一个bug 分配菜单时未加入父id&#xff0c;导致分配菜单失效 <!-- :check-strictly"true" 默…

框架的使用

什么是框架&#xff1f; 盖房子&#xff0c;框架结构 框架结构就是房子主体&#xff0c;基本功能 把很多基础功能已经实现&#xff08;封装了&#xff09; 框架&#xff1a;在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效…

FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践

简介 FreeBSD、CBSD、Jail和Ubuntu&#xff0c;四者的组合方案可以说是强强联合&#xff0c;极具性价比和竞争力&#xff01;同时安装简单方便&#xff0c;整体方案非常先进。 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案…

机器学习(V)--无监督学习(二)主成分分析

当数据的维度很高时&#xff0c;很多机器学习问题变得相当困难&#xff0c;这种现象被称为维度灾难&#xff08;curse of dimensionality&#xff09;。 在很多实际的问题中&#xff0c;虽然训练数据是高维的&#xff0c;但是与学习任务相关也许仅仅是其中的一个低维子空间&am…

python3GUI--记账助手By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;开发环境三&#xff0e;预览1.登录&注册2.主界面3.新增账单1.当前日期2.选择日期3.添加成功 4.删除账单4.筛选账单5.账单数据汇总1.日账单2.月账单3.年账单 四&#xff0e;设计心得1.项目代码结构2.UI设计概览3.UI设计详细1.登录…

【数据结构】三路快速排序

1. 简介 传统快速排序用的是双路快速排序&#xff0c;即将大于基准值的部分放到基准值右侧&#xff0c;小于基准值的部分放到基准值左侧&#xff0c;但是这种算法面对过多的重复数据的数组&#xff0c;时间复杂度会增多&#xff0c;于是就有了三路快速排序的思想&#xff0c;其…

74HC04做陶瓷和晶体振荡器实验初步

面包板&#xff0c;电压5V 17.6Mhz晶振&#xff0c;起振OK 其他的465K&#xff0c;1M&#xff0c;4M&#xff0c;10M&#xff0c;16M&#xff0c;20M陶瓷不起振 更换过Rf也不起作用&#xff0c;待研究。 rf参考&#xff0c;这是人家博客给出的。 还看到一个文章说&#xff…

Codesys 2.3 软件下载及安装教程+所有版本大全集合

目录 一 、整理的软件安装包大全二、视频安装教程三、安装步骤四、下载软件安装包 一 、整理的软件安装包大全 二、视频安装教程 三、安装步骤 (1)、通过以上 我们获取了CODESYS的安装程序&#xff0c;图标如下图所示,双击运行 (2)选择语言为英文 (3)建议关闭所有其他运行程序…

程序员“种种”副业,有没有适合你的?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…