首页 >游戏评测

cpp开篇

2019-11-09 22:40:55 | 来源: 游戏评测

在这个世界上,不管使用哪种计算机语言,他(她)们第一段代码一定是“hello world!”,为何学习程序第一句是hello world 而不是其他的语句?下面介绍完这位大牛上面的疑问就解决了。这位大牛是 C 语言的作者Dennis RitchieDennis Ritchie(丹尼斯·里奇)在他的名著 《C 程序设计语言(The C programming Langupeach)》中第一次引入传为后世经典其它语言亦争相效仿以示致敬。

维基百科链接:丹尼斯.里奇

下面看一下hello world 的源程序是什么样的。

c语言版

#include //由于用到printf库函数,所以要包括printf所在的头文件 int main() //程序入口 { printf(“Hello World!\n”);//向屏幕输出Hello World! return 0; //main函数的返回值 }

c++版的

#include //程序中由于用到了cout库函数所以要包含cout所在的头文件 using namespace std; //用到的命名空间 int main() //程序的入口表示计算机从哪里开始履行此程序 { cout

好,我们见到了源码,源码是如何被计算机辨认运行的呢?她经历的那些过程?

学过c的大概知道,从源程序到可执行程序经历了四个进程:

预处理->编译->汇编->链接

可是这四个进程到底产生了什么可能其实不清楚,由于现在大多数人使用集成开发环境(IDE),它隐藏了很多细节。但是由于IDE减少了环境配置,合并开发流程,便于快速开发,所以使用IDE更适用于初学者。

下面我们来看看每个进程中到底产生了甚么

下面以vim编辑器,gcc编译器为例子,给大家展现一下

我们已经在vim编辑器中写好了Hello World的源程序

现在履行预处理命令;

gcc -E hello.c -o hello.i

//结果会出现下面这么一大坨 1 \hello.c\ # 1 \\ 1 # 1 \\ 3 # 329 \\ 3 # 1 \\ 1 # 1 \\ 2 # 1 \hello.c\ 2 ...................省略N多行 int main() { printf(\Hello World !\n\); return 0; }

我们会看到在于处理阶段会产生以下内容

预处理器把中的内容读取过来,直接插入到程序文本中。

我们的注释内容不见了。

我们得到另一个C程序,通常是以 .i 作为扩展名。

现在执行编译命令;

gcc -S hello.i -o hello.s

//编译后的结果是这样的,能看明白吗? .section __TEXT__textregularpure_instructions .macosx_version_min 10 11 .globl _main .align 4 0x90 _main: ## @main .cfi_startproc ## BB#0: pushq %rbp Ltmp0: .cfi_def_cfa_offset 16 Ltmp1: .cfi_offset %rbp -16 movq %rsp %rbp Ltmp2: .cfi_def_cfa_register %rbp subq $16 %rsp leaq L_.str(%rip) %rdi movl $0 -4(%rbp) movb $0 %al callq _printf xorl %ecx %ecx movl %eax -8(%rbp) ## 4-byte Spill movl %ecx %eax \hello.s\ 34L 670C

我们会看到编译阶段会产生...... 好像就是把上面的 .i 文件依照一定规则翻译成现在的 .s 文件。 (.s文件是汇编代码)

现在履行汇编命令

gcc -c hello.s -o hello.o

Ïúíþ^G^@^@^A^C^@^@^@^A^@^@^@^D^@^@^@^@^B^@^@^@ ^@^@^@^@^@^@^Y^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^^K^@^@^@^B^@^@^U^@^@^@^@^A^@^@^F^A^@^@^@^O^A^@^@^@^@^@^@^@^@^@^@^G^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@_main^@_printf^@^@ .............. ~ ~ ~ ~ \hello.o\ [noeol][converted] 3L 816C

我们再看看汇编阶段到底产生了什么

将汇编文件翻译成机器指令并打包成可重定位目标程序的 . O 文件。该文件是二进制文件字节编码是机器指令。

到这个阶段已不是人能看得晓得了!反正我是看不懂。

最后链接阶段会产生甚么呢?

gcc hello.o -o hello

úíþ^G^@^@^A^C^@^@^B^@^@^@^O^@^@^@°^D^@^@^@ ^@^@^@^@^@^Y^@^@^@H^@^@^@__pAGEZERO^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^Y^@^@^@Ø^A^@^@__TEXT^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^p^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ...........//@符号好像比上面的多了好多 ^@^@8^@^@^@^K^@^@^@p^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^B^@^@^@^B^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ \hello\ [noeol][converted] 5L 8498C

我们在程序中用到了printf函数,printf函数存在一个名为printf.o的预编译好的目标文件中,链接器就是将这个printf.o文件和我们的hello.o文件以某种方式结合在一起,生成一个可执行hello文件,加载到内存中去,有系统去执行。

好,我们学习的第一段程序到此结束了!后续会有更精彩的内容!

有任何建议 ,意见,批评请在评论中或私信给我哦

枸酸西地那非片是什么

伟哥的副作用

伟哥是什么味道

猜你喜欢