首页 > 其他分享 >c语言拾遗

c语言拾遗

时间:2023-04-08 21:13:52浏览次数:38  
标签:文件 gcc 语言 代码 拾遗 编译 file 链接

概述

gcc

-E 则经过预编译 变成.i文件,还是c代码只是对#中进行字符串的展开和复制

-S 则经过编译 变成 .s文件,为汇编代码

-c 则经过汇编 变成.o文件,为二进制文件

然后 将许多(也许也就几个).o文件链接在一起

生成linux中的可执行文件.out

直接gcc会将上述整个

如果要在编译停下来用 -E

如果要在汇编停下来用 -s

在链接时停下来用 -c

 

C语言编译链接过程通常包括四个部分:预处理、编译、汇编和链接。

  1. 预处理

预处理是指对源代码进行宏替换,头文件引入等预处理操作的过程。预处理器会将所有以 # 开头的指令进行处理(例如 #include、#define 等),并将结果输出到一个临时文件中。

可以使用以下命令进行预处理:gcc -E file.c -o file.i

  1. 编译

编译器将预处理后的文件转换为汇编代码。在这个阶段,编译器会检查代码语法和语义是否正确,并对代码进行优化。编译器将 C 代码转换为汇编语言代码,并将结果输出到一个目标文件中。

可以使用以下命令进行编译:gcc -S file.i -o file.s

  1. 汇编

汇编器将汇编代码转换为可重定位的二进制目标文件。它会将汇编代码转换为机器代码,并生成目标文件。目标文件包含了机器指令、符号表以及其他一些与目标文件相关的信息。

可以使用以下命令进行汇编:gcc -c file.s -o file.o

  1. 链接

链接器将多个目标文件合并为一个可执行文件。在这个阶段,链接器会解决全局符号的定义和引用关系,并把这些目标文件合并为一个可执行文件。

可以使用以下命令进行链接:gcc file.o -o executable

 

objdump 是用来查看一个二进制文件的反汇编

 

预编译

‘#’ 是预编译代码的标识

如:#include

#define

展开或代替

gcc a.c --verbose

 

 

如上我们甚至能在printf 中写 #include

但是我们知道 #include只是在寻找文件并复制,那么就很好理解了

 

 

在预编译的情况下,变量是不用通过定义即可使用的

除非变量被定义了,否则就为空

aa==bb为空,所以这里是输出Yes

 

还有#if 这是有判断的功能的

再来看看宏定义:

 

 

A 是 'aaaaaaaaaa'

TEN(xxx) 使用TEN(xxx),那么xxx会被重复十遍(按照上面代码写的)

那么B 就是十个'aaaaaaaaaa'

C是 十个 B

.........

巧妙利用宏还可以写出精炼的代码:

 

 

链接

 

 

将上面两个.c文件经过编译变成.o文件后,可以用gcc 将其链接

其实我们#include时都是看到的如:

 

 

的定义

其实最后都是经过链接才能真正使用的

 

加载

 

任何类型的指针其首先都是一个纯粹的保存地址的地方

所以任何一个指针其都可以赋值给void *

 

int * , float * ......

其首先都是一个纯粹的指针,前面的int等是对 这个指针指向的地方的解读

当其中的数据参与运算时,就按照 int /float ...类型进行运算

 

 

 

 

 

  main&main的值相同,是因为函数名本身就是一个指向函数入口地址的指针。

  注意这里main不是变量,也就是说没有花空间来保存main

  main === &main

  而argv&argv的值不同,则是因为它们代表的是不同的变量。argv是一个指向字符指针数组的指针,用于存储命令行参数。而&argvargv这个指针本身的地址,也就是说它存储的是argv指针变量在内存中的地址。

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:文件,gcc,语言,代码,拾遗,编译,file,链接
From: https://www.cnblogs.com/cilinmengye/p/17299229.html

相关文章

  • go语言学习-冒泡排序
    冒泡排序冒泡排序属于交换类的排序算法,比如有一段乱序的数,591681464925463第一轮迭代:从第一个数开始,依次比较相邻的两个数,如果后面的一个数比前面的一个数大,那么交换位置,直接到处理最后一个数,最后这个数是最大的第二轮迭代,因为最后一个数已经是最大的了,重复第一轮操作,......
  • 分析以下数字的规律1 1 2 3 5 8 13 21用Python语言编程实现输出,此为斐波那契数列
    方法一:list1=[]#定义一个空列表foriinrange(15):#遍历语句循环15次ifi==0ori==1:#前两个数字的值都是1list1.append(1)#print(list1)else:list1.append(list1[i-1]+list1[i-2])print(list1)方法二:list1=[1,......
  • C#语言基础(类型转换)
    类型转换分为两类:自动转换(隐式转换)与强制转换。1.自动转换:将一个小范围的数据类型转换成较大范围的数据类型(实际上就是从低精度的数值类型到高精度的数值类型的转换)。例:doublea=10.25;        intb=10;        doubleresult=a+b;//将int类型转换为d......
  • Solon2 之 Groovy 语言开发后端接口项目
    今天再做个新的尝试,用Solon框架写个Groovy后端项目。借助“SolonInitializr”生成个项目模板,会比较方便。1、生成项目模板打开“SolonInitializr”:https://solon.noear.org/start/,在语言那儿选择"Groovy",再选上项目类型为“Gradle-Groovy”。然后点“生成”就会自......
  • 巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)
    转自刘悦研发少闲月,九月人倍忙。又到了一年一度的“金九银十”秋招季,又到了写简历的时节,如果你还在用传统的Word文档寻找模板,然后默默耕耘,显然就有些落后于时代了,本次我们尝试使用云平台flowcv高效打造一份巧如范金、精比琢玉的高品质Golang技术简历。首先来到云平台:flowcv.com......
  • 逍遥自在学C语言 | 位运算符的基础用法
    前言一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、构成和表达方式位运算符是一组用于在二进制数之间进行操作的运算符运算符名称示例&位与a&&b|位或a|b......
  • c语言结构体
    #include<iostream>#include<string>usingnamespacestd;structm{inta;stringb;};intmain(void){inti,j;inta[10];charb[10];char*e,*f;mk[10];k[0]=k[1];//e=f;//b[0]=b[1];//a[0]......
  • 0-C语言与汇编语言的转换
    汇编语言入门四:打通C和汇编语言-知乎Win10下C语言转8086汇编-博客园:https://www.cnblogs.com/VxerLee/p/15264290.htmlLinux执行汇编程序在Linux下运行你的第一个汇编程序_linux怎么执行汇编代码_冷色调的夏天的博客-CSDN博客在线网站:CompilerExplorer强烈推荐一个在线网......
  • 语言服务器
    笔记软件在2023/4/615:08:06推送该笔记语言服务器与客户端语言服务器语言客户端语言服务器运行在单独的进程有两个好处:只要能通过LSP通信,语言分析工具可以用任何语言实现。语言分析工具一般非常消耗CPU和内存,在单独的进程中运行能避免大性能开销lsp-sample:本篇教程的......
  • 1.实现语言客户端
    笔记软件在2023/4/614:01:04推送该笔记LanguageClient"activationEvents":["onLanguage:plaintext"]这个部分告诉VSCode只要打开纯文本文件之后就立刻激活插件(例如:打开一个.txt​文件)"configuration":{"type":"object","title"......