首页 > 学院 > 开发设计 > 正文

C语言点滴积累

2019-11-08 19:35:47
字体:
来源:转载
供稿:网友

写在前面的话:经过一段时间的学习我发现,有很多语法知识我并没有足够的理解,我记得有人曾和我说过,理解语法需要换个角度,如果你作为一个C语言创始人,你会怎么做?

举个例子,传参,将数组降价为指针,既节省了空间,又让程序媛在编写程序时方便了许多。所以有些时候换个角度,换种环境去理解。你会深刻的感受到那句话——蓦然回首那人却在灯火阑珊处。。。。

预处理

执行宏替换,条件编译,包含指定头文件,去掉注释。所有以#开头的命令行都是预处理要处理的对象

这些命令行的语法独立于语言的其他部分,它们可以出现在任何地方其作用可延续到所在翻译单元的末尾,与作用域无关

行边界有实际意义:通过将以反斜杠/结束的指令行末尾的反斜杠/与其后面的换行符删除。可以将若干指令行合并成一行。这种处理要在分割记号之前进行。

预处理记号:可以是任意语言记号,也可以是#include指令

文件包含指令#include控制指令形式:

1.#include<文件名>

该行将被替换为文件名指定的文件内容

文件名不可包含>或换行符

文件名非法字符 “、`、/*

2.#include"文件名"

先从源文件位置开始搜索文件,如找到按上面定义方式处理也就是会在对应的引用目录中查找对应头文件,意思就是,如果使用#Include "stdio.h",如果你项目目录中没有这个头文件,它会定位到C:/Keil/c51/INC/stdio.h这个头文件

如文件名包含字符 “、`、/*仍非法

可以使用字符>

3.#include 记号序列

同上述两种方式不同,它将按照扩展文本的方式扩展记号序列进行解释。记号序列必须被解释为<...>或"...",两种方式之一,再按照上述方式处理

#include文件可以嵌套

http://blog.csdn.net/zhu_liangwei/article/details/9745179

(这里有嵌套的具体解释,还包括了条件编译的解释)

http://blog.csdn.net/gmpy_tiger/article/details/50903620

(这是我在学习上面文章讲述内容中遇到的问题,关于Makefile gcc 的)

http://blog.csdn.net/gmpy_tiger/article/details/50903620

编译 检查语法

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

可执行文件

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表