第三章-C语言原理
谁调用了main函数,返回值给谁了呢?
C99建议把main函数指定为int型,他要求函数带回一个整数值,在main函数中执行的最后一句return 0;
,当主函数正常结束时,返回0,反之,当函数出现异常或者执行错误时,函数值为一个非零整数.这个函数值是返回给调用main函数的操作系统的,因此,每个C语言程序都必须有一个main函数
Mac-OS平台如何创建C语言文件?
- 利用Xcode:代开XCode->顶部工具栏File->new->CFile->输入文件件名
01.第一个C语言程序.c
,注意写上后缀名 - 利用终端:
touch xx.c
open xx.c
即可
C语言的结构
- C程序的结构:由函数组成
- 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为函数。所以,你可以说C语言程序是由函数构成的
- C程序的入口
- C程序的入口是一个名字叫做main的函数,简称main函数
- 不管整个程序中有多少个函数,都是先执行main函数
C语言的第一个程序
#include <stdio.h>
int main(){
printf("hello world!");
return 0;
}
- 分析:前面说过,输入输出函数不是C语言的部分,是C编译系统提供的库函数;
- 因此在使用函数库中的输入输出函数时,编译系统要求程序提供有关此函数的信息,(例如,对这些输入/输出函数的声明和宏的定义/全局量的定义等.
#include <stdio.h>
的作用就是用来提供这些信息的;- stdio.h是系统提供的一个文件名,
stdio
是”standard input & output”的缩写,文件后缀.h的意思是头文件(header file),头文件(.h)的目的就是可以放在程序个文件模块的最上头的.
C程序的编译/链接/运行
- 整个C程序的过程:
- 编辑:在文件中编写代码
- 编译:
- 作用:把C语言代码翻译成0和1
- 过程:先用C编译系统提供的”预处理器(又称预编译器,预处理程序)”,对程序中的预处理指令进行编译预处理,例如:#include
,就是将stdio.h头文件的内容读取进来,取代#include 行. - 由预处理得到的信息与程序其他部分一起,组成一个完整的/可以用来正式编译的源程序
- 然后由编译系统对该源程序进行编译
- 注意: 在编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成,用户不必分别发出二次指令.
- 工具:
- XCode编译器
- XCode3 用的是gcc编译器
- XCode4开始用的是LLVM编译器(该编译器前端用的是clang编译器,编译器分前端跟后端,前端就是用来翻译的)
- 用Visval C++编译的后缀名为.obj
- XCode编译器
- 怎么使用clang编译器来编译代码呢?
- clang编译器提供了很多UNIX指令,只要我们使用这些指令就可以编译C语言代码
- 指令:
cc -c 需要编译的文件名.c
- -c的c是compile:编译的意思`
- 操作:
- 打开终端cd到.c文件目录下,输入
cc -c 01.第一个C语言程序.c
回车,就会发现文件目录下多了一个.o文件(目标文件:0和1文件)
- 打开终端cd到.c文件目录下,输入
- 既然.o是0和1文件,为何不能直接执行呢?
- 原因:代码中我们用到了printf函数,因为这个函数不是我们自己定义的,是系统自带的,因此我们程序运行过程中依赖于系统自带的的东西,因此,.o只包含我们自己写的东西,因此,就有了链接操作
- 编译器的错误和警告功能
- 如果代码有语法问题,编译器会直接报错。并指出错误的个数和具体行号。
- 只要有1个错误,程序就不能编译成功,也不会生成.o文件
- 警告信息只是编译器的一些建议,并不影响编译通过
- 链接:
- 其实就是把.o与跟系统自带的函数库合并在一起(当多个文件时,连还要连接所有的.o),生成一个可执行文件(a.out)
- 经过编译得到的二进制目标文件,还不能提供计算机直接运行.一个程序可能包含若干个源程序文件,而编译是以源程序文件为对象的,每个源程序文件对应编译一个目标文件.连接就是把编译得到的各个目标模块连接装配起来,再与函数库相连接成一个整体,生成可执行程序(executive program),在Visual C++中器后缀名为.exe,如f.exe 在clang为:a.out
- 由链接器完成,clang编译器里面已经包含了链接指令
- 指令:
cc 目标文件.o
回车,生成a.out
文件
- 运行可执行文件
- 两种方式:
- 双击:第一次双击会弹出让你选择什么程序来运行,应用程序->终端(Xcode也可以),直接就可以看到输出结果了
- 命令:
./a.out
./告诉他是当前文件,注意没空格
- 为了编译/连接/运行,必须要有相应的编译系统,目前使用的很多编译系统都是集成环境(IDE)的,把程序的编辑/编译/连接/运行等全部操作都几种在一个界面上运行.
- 其他clang指令
- 修改可执行文件名称:
cc xxx.o -o 文件名
- 一起编译、链接:
cc xxx.c
- 修改可执行文件名称:
整个程序的运行过程
小结: C语言代码可以写在其他类型的文件中,比如.text文件中,但是由于clang编译器不识别该文件,识别.c文件,因此写在了.c文件中