1.C语言源程序到运行程序经过哪几个步骤
2.很多C语言开源软件的码讲源代码很难懂,要快速理解有什么技巧吗?
3.cè¯è¨ç¨åºä»£ç
C语言源程序到运行程序经过哪几个步骤
1、码讲预处理在这一阶段,码讲源码中的码讲所有预处理语句得到处理,例如:#include语句所包含的码讲文件内容替换掉语句本身,所有已定义的码讲apmrover源码分析宏被展开。
根据#ifdef,码讲#if等语句的码讲条件是否成立取舍相应的部分,预处理之后源码中不再包含任何预处理语句。码讲
GCC预处理阶段可以生成.i的码讲文件,通过选项-E可以使编译器在预处理结束时就停止编译。码讲例如:gcc -E -o hello.i hello.c
2、码讲长线公式源码编译
这一阶段,码讲编译器对源码进行词法分析、码讲语法分析、码讲优化等操作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。
可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。例如:gcc -S -o hello.s hello.c
3、汇编
这一阶段使用汇编器对汇编代码进行处理,节日大全源码生成机器语言代码,保存在后缀为.o的目标文件中。
当程序由多个代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。
目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:gcc -c -o hello.o hello.c
4、链接
经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,空指标源码文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。gcc -o hello hello.c
5、运行:执行.EXE文件,得到运行结果。
很多C语言开源软件的源代码很难懂,要快速理解有什么技巧吗?
阅读代码是一项重要的能力。你觉得技术比你弱的人拿的工资比你高,他有一项很重要的能力就是阅读代码。
开源代码在变量命名上,flash源码工程注释上一定做得比较好了,你所看不懂的地方只有2种可能。
1,编程技巧。这种比较容易弄懂,如果你对编程语言熟悉的话,一步一步展开来就知道作者想表达的意思了。(这个就像小时候学语文的语法,“把”字句改成“被”字句,意思没变,写法变了)
2,算法。这个就算你一步一步展开都不一定能看懂,这个要有一定的数学知识,比如向量积,线性回归,微分方程,卷积等。如果是很专业的产品,还要涉及到物理,化学,电气,概率论等等。(这个就像阅读文言文,没学过就看不懂,还可能会理解错误)
所以看不懂代码就只有提升自己的知识水平,没有捷径可走。但你可以针对性的去训练上述2条中的弱项,语言是基础,算法是核心。
记得我第一份工作是做单片机产品维护,平时工作就是在现有的产品上改改功能代码,增加新功能。那个时候没做过什么产品,虽然也会C语言,但是看别人代码就像看天书一样,主要是技术不到家,还遇到过一些让人吐血的代码,可能是公司得罪了那个工程师,代码里没一个注释,而且变量名全是k,kk,tt这种不好理解的,简直让我想把那个工程师罚站马路中间半个小时,感觉还不如自己重写快一点,后面慢慢的积累了一些经验才发现自己当时看代码的方式和思维不对。一个源码,如果你用通过代码去理解产品功能那你一定会看到心肌梗塞都吃不透,正确的应该是先把产品功能吃透,然后把功能分模块进行分析,如果是我,我会怎么用代码去实现它?最好自己写代码做一遍,在写的过程中你一定会碰到棘手的技术点不知道该怎么去实现它,这个时候最好自己努力思考一下,最后不管你有没想出来,你再去看别人的代码是如何实现的,这样你就能一步步吃透别人的代码,至少程序架构的核心部分知道怎么处理了,剩下的细节实现其实已经无关紧要了,这是一个循环渐进的过程,也是提升自己水平很好的方法,过程越痛苦你的提升就越大。cè¯è¨ç¨åºä»£ç
Cè¯è¨æºä»£ç ï¼å°±æ¯ä¾æ®Cè¯è¨è§åæååºçç¨åºä»£ç ï¼å¸¸è§çåå¨æ件æ©å±å为.cæ件å.hæ件ï¼åå«å¯¹åºCæºæ件(source file)åC头æ件(header file)ãCè¯è¨æ¯ä¸é¨ç¼ç¨è¯è¨ï¼ç®åç¹è¯´ï¼å°±æ¯ç±äººç±»ä¹¦åæç §ä¸å®è§è书åçå符ï¼éè¿ä¸å®æ段ï¼ç¼è¯é¾æ¥ï¼è½¬æ¢åï¼å¯ä»¥è®©çµèæè å ¶å®çµåè¯çï¼è¯»æï¼ï¼å¹¶æç §å ¶è¦æ±å·¥ä½çè¯è¨ãå¨ææçç¼ç¨è¯è¨ä¸ï¼Cè¯è¨æ¯ç¸å¯¹å¤èèåå§çï¼åæ¶ä¹æ¯å¨åç±»è¯è¨ä¸æ´æ¥è¿ç¡¬ä»¶ï¼æ为é«æçç¼ç¨è¯è¨ã
ç¸å ³å 容ï¼
Cè¯è¨æ¯ä¸é¨é¢åè¿ç¨ç计ç®æºç¼ç¨è¯è¨ï¼ä¸C++ãC#ãJavaçé¢å对象ç¼ç¨è¯è¨ææä¸åãCè¯è¨ç设计ç®æ æ¯æä¾ä¸ç§è½ä»¥ç®æçæ¹å¼ç¼è¯ãå¤çä½çº§åå¨å¨ãä» äº§çå°éçæºå¨ç 以åä¸éè¦ä»»ä½è¿è¡ç¯å¢æ¯æ便è½è¿è¡çç¼ç¨è¯è¨ã
Cè¯è¨æè¿°é®é¢æ¯æ±ç¼è¯è¨è¿ éãå·¥ä½éå°ãå¯è¯»æ§å¥½ãæäºè°è¯ãä¿®æ¹å移æ¤ï¼è代ç è´¨éä¸æ±ç¼è¯è¨ç¸å½ãCè¯è¨ä¸è¬åªæ¯æ±ç¼è¯è¨ä»£ç çæçç®æ ç¨åºæçä½%-%ãå æ¤ï¼Cè¯è¨å¯ä»¥ç¼åç³»ç»è½¯ä»¶ã
å½åé¶æ®µï¼å¨ç¼ç¨é¢åä¸ï¼Cè¯è¨çè¿ç¨é常ä¹å¤ï¼å®å ¼é¡¾äºé«çº§è¯è¨åæ±ç¼è¯è¨çä¼ç¹ï¼ç¸è¾äºå ¶å®ç¼ç¨è¯è¨å ·æè¾å¤§ä¼å¿ã计ç®æºç³»ç»è®¾è®¡ä»¥ååºç¨ç¨åºç¼åæ¯Cè¯è¨åºç¨ç两大é¢åãåæ¶ï¼Cè¯è¨çæ®éè¾å¼ºï¼å¨è®¸å¤è®¡ç®æºæä½ç³»ç»ä¸é½è½å¤å¾å°éç¨ï¼ä¸æçæ¾èã
Cè¯è¨æ¥æç»è¿äºæ¼«é¿åå±åå²çå®æ´çç论ä½ç³»ï¼å¨ç¼ç¨è¯è¨ä¸å ·æ举足轻éçå°ä½ã