c语言入门-01

摘要:
23intmain(){4//printelloworld5printf(“helloworld”);预编译我们可以使用gcc-E生成预处理的文件(1)删除所有#定义,也就是那些带有#(3)process#include的定义,并将#include指向的文件插入行(4)删除所有注释(5)添加行号和文件标记。

当我们学c语言我们学些什么.

[1]编译机制

当我们写好c的代码,生产了程序,这中间到底做了些什么?

  c语言入门-01第1张

这个就是c语言的编译过程 我们分别来解析这上面的过程。

我们写出我们第一个c程序。
  

  1 #include<stdio.h>
  2 
  3 int main(){
  4     // print hello world   
  5     printf("hello world");
  6                   
  7 }                 
~           

1>预编译

  我们可以通过 gcc -E 来生产预处理文件

  c语言入门-01第2张

  (1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

  (2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

  (3)处理#include,将#include指向的文件插入到该行处

  (4)删除所有注释

  (5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

  (6)保留#pragma编译器指令,因为编译器需要使用它们。

2>编译

  通俗点说就是吧人类能读懂的c语言翻译成机器能听懂的语言

  通过 -S 参数可以吧代码编译成汇编代码

  1     .file   "hello.c"
  2     .section    .rodata
  3 .LC0:
  4     .string "hello world"
  5     .text
  6     .globl  main
  7     .type   main, @function
  8 main:
  9 .LFB0:
 10     .cfi_startproc
 11     pushq   %rbp
 12     .cfi_def_cfa_offset 16
 13     .cfi_offset 6, -16
 14     movq    %rsp, %rbp
 15     .cfi_def_cfa_register 6
 16     leaq    .LC0(%rip), %rdi
 17     movl    $0, %eax
 18     call    printf@PLT
 19     movl    $0, %eax
 20     popq    %rbp
 21     .cfi_def_cfa 7, 8
 22     ret
 23     .cfi_endproc
 24 .LFE0:
 25     .size   main, .-main
 26     .ident  "GCC: (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406"
 27     .section    .note.GNU-stack,"",@progbits

 通过-c 可以生成二进制文件 .o 这里的的就是机器码了

  c语言入门-01第3张

3>连接

  c语言入门-01第4张

说白了 我们的prinf这个函数并不是我们自己写的而是库文件里面的内容

连接的作用就是让库文件跟我们写的代码产生联系,然后我们代码中能代用库中方法

免责声明:文章转载自《c语言入门-01》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AJAX技术框架及开发工具 转DHCP服务器配置实践下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Foxmail忘了帐户访问密码咋办?

我们为防止别人偷看Foxmail邮箱,通常会为Foxmail帐户设一个访问密码。要一不小心把这个密码搞丢了怎么办?下面系统之家介绍一些方法可以解一时之急:1.给Account.stg 文件更名或删除   其实,可以更简单进入忘记口令的账户,浏览自己以前的信件。方法是:进入Mail 文件夹下以你的账户名为目录名的目录下,将其中的Account.stg 文件...

QT MSVC中文编译出错error: C2001: 常量中有换行符 --- 解决方案

前言 这个问题一直存在,以前是妥协,现在实在是忍不了,不解决,强迫症都要犯了,于是百度了一下,看到有一篇文章是这样解决的,于是亲测,确实有效果,记录如下 正文 QT上用MSVC去编译部分含有中文的字符串时会出现编译错误 error: C2001: 常量中有换行符 ,但用MinGW就不会。需在后面加个正常的字符才能正常编译,但出现 了。其编码如下图,明...

【封装那些事】 未利用封装

未利用封装 客户代码使用显式类型检查(使用一系列if-else或switch语句检查对象的类型),而不利用出层次结构内已封装的类型变化时,将导致这种坏味。 为什么要利用封装? 一种臭名昭著的坏味是,在客户代码中使用条件语句(if-else或switch语句)来显式地检查类型,并根据类型执行相应的操作。我们这里讨论的是:要检查的类型都封装在了层次结构中,但...

VC中使用Matlab Engine出现"无法找到libeng.dll"的问题

VC中使用Matlab Engine出现"无法找到libeng.dll"的问题 本以为使这个原因 ,其实不是我2了 #include "engine.h" //终于知道为什吗老是找不到那个库文件--是因为添加的头文件是以引号括起来的啊 //#include <engine.h> 不是因为环境变量没有生效的缘故 其实目前来说应该是这个问题no c...

Dockerfile参考

Docker可以通过阅读a的指示自动构建图像Dockerfile。Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。使用docker build用户可以创建一个自动构建,连续执行几条命令行指令。 该页面描述了您可以在Dockerfile中使用的命令。阅读本页后,请参阅Dockerfile面向提示的指南的最佳做法。 用法...

如何计算每个基因的覆盖度与深度

 如何计算每个基因的覆盖度与深度,有多种方法可以完成。如下演示使用samtools depth命令方法   1. 数据下载 1.1 Fastq文件下载   从NCBI下载Illumina Hiseq X Ten平台的RNA-Seq数据SRR7751429信息如上图所示。 1.1.1 使用wget命令(sra-toolkit工具下载太慢)下载 wget f...