PS:本文章参考自C primer plus。

编程机制

生成程序的具体过程根据语言和操作系统的不同。C语言是可移植性语言,可以在多种不同的环境下使用,包括UNIX,Linux,MS-DOS,Windows,Macintosh OS等。
本系列文章基本只关心不同环境所共有的部分,至于一些不同环境的不同处理,会特别指出。

事实上,就学习C语言而言,我们无需理会编程机制,但是了解一下这方面的知识,对于学习/理解C程序有着莫大的帮助。

目标代码文件,可执行文件和库

C程序在生成过程中会有许多中间文件的生成,这里简单讲解一下最基本的过程。

首先,预处理器将源代码文件(.c)进行预处理,即对 预处理指令 的操作,包括头文件展开,宏定义展开等,处理后的文件仍然是纯文本(.i);

然后,编译器对处理后的源代码进行编译,编译结果为汇编程序(.s),仍然是纯文本;

汇编器负责从汇编代码到二进制程序的转换,结果为 可重定位目标代码文件 ,从这个(这些)文件(.o)开始就是二进制程序了,但是并不能在操作系统上直接运行,因为它还缺少 启动代码 等信息:

  • 目标代码文件缺少启动代码,有了对应操作系统特定的启动代码,目标代码才能被正常地处理运行;
  • 目标代码文件还缺少库函数,几乎所有的C程序都需要使用到C标准库中的函数,例如printf()函数的使用等,这些函数是C语言标准库已经写好的,我们只需要将他们包含进去即可,这些信息都存放在相应的文件中,中包含有许多函数的目标代码

最后需要进行 链接 操作,链接器的作用是,将用户的目标代码和库代码,以及操作系统绑定的标准启动代码整合到一起,最终生成的二进制文件才是我们能够运行的程序。

---WAHAHA,2025.2.6

# C代码的基本要素

我们在上一篇文章已经讲解了一个最基本的完整C程序的各个组成部分了,这里要进一步进行描述。

我们可以看到,在C代码中,有着各式各样的字符,不仅有标点符号,还有数字,字母,他们的排列构成各个标识符指令数据等等。对于这些内容,有着一些最基本的规范。

字符集

C语言基于英文字符进行编写,正常来说,我们所有需要使用到的字符,都可以在我们日常使用到的键盘上找到(不使用任何输入法),也就是说,无论是我们拼写的变量名,还是各个指令,亦或是运算符,都需要使用英文字符去组成,而我们的中文字符,中文汉字,或者是其他国家的各种字符,从规范的角度,都不应该出现(字符串除外)。

因此必须要注意的是,对于变量名等标识符,我们应该只使用英文字母(和其他C语言允许的英文字符)进行构成;

对于运算符等符号,我们只能使用英文的标点符号,而且不同于标识符,这里是硬性要求,绝对不能使用除英文字符以外的字符—除非你想在你的程序里翻来覆去半天看不出问题。

所以,在编写程序时,为了您和电脑的健康和安全,请务必关闭中文输入法!(除非你要输入一个中文的字符串)

标识符的命名规范

我们来看一下标准中对标识符的定义:
image-20231001003151232

说人话就是,各种我们能自己命名的玩意都是标识符。doge~
其中就包括变量名,函数名等。

关于标识符的命名方式,有一些要求:

1
2
3
4
5
6
1 标识符必须以字母a-z、 A-Z或下划线开头,后面可跟任意个(可为0)字符,这些字符可以是字母、下划线和数字,其他字符不允许出现在标识符中
2 标识符严格区分大小写字母
3 标识符的长度,c89规定31个字符以内,c99规定63个字符以内(没有哪个疯子超出这个范围吧...)
4 C语言中的关键字,有特殊意义,不能作为标识符(例如ifforwhilegotoreturn等)
5 自定义标识符最好取具有一定意义的字符串,便于记忆和理解
6 不同平台最好遵循各自的命名规范,例如Windows一般使用驼峰命名法,Linux使用下划线命名法

这里说的关键字,在下面说明。

关键字和保留的标识符

关键字

关键字就是构成C语言的关键词,由它们构成C的语法体系,所以,这些词语是不能够被使用做标识符名称的。

具体见:https://zh.cppreference.com/w/c/keyword

主要的是这些:

image-20231001003820548 image-20231001003835758

其他还有很多,大部分是新标准引入的,我们暂时也用不到,这里就不放图了。

保留的标识符

我们直接看标准的描述,这里放一张最基本的要求,实际上我们先记住,自定义的标识符不能和关键字重名。

image-20231001004113590

—WAHAHA,2023.9.30

C语言的相关文件类型

源文件

源文件即C的源代码文件,以后缀.c结尾,我们编写的一般代码,包括函数定义等,都放在源文件中:

image-20231107024355840

头文件

我们在编写程序时,往往要使用到很多的外部库,用以支持更多的功能,例如C语言默认的标准库,或者是我们自己编写的库,再或者是第三方开发者写好的库。

这些库中包含有许多的已经写好的函数等内容,我们往往找不到他们的源文件,因为他们一般是编译好的动态库文件,没有源代码,这时候,我们需要使用头文件来引入库中的各种声明,例如一些函数的声明,常量的声明,宏的定义,他们往往都在头文件当中。我们只需要使用#include指令来在我们的源文件中引用该头文件,就可以使用对应的函数了:

image-20231107024955234

其他中间文件

编译器在编译过程中会生成一些中间文件,例如.s汇编文件,.o目标文件等等,我们暂时无需理会。

另外,不同的软件有着各自管理C语言工程的方式,他们往往会在项目文件夹下生成各种各样的文件,他们并不是C标准使用的文件,而是软件特定生成的文件,用于管理项目。例如VS会生成.sln文件,VC++6.0会生成.opt文件等等。

目前,我们仅仅需要关心.c源文件和.h头文件这两种文件即可。

---WAHAHA 2023.11.07



上一篇:c语言教程-1_1-什么是程序

下一篇:c语言教程-2-环境搭建