1.课程简介
1.1课程阶段介绍
Unix/linux系统下的开发基础
- 主要学习常用的基本命令和vi的用法
- 依赖于Unix/linux系统,部分命令和wiws相同
标准c语言
- 主要学习c语言的标准语法;
- 不依赖于具体的操作系统,支持unix/linux/wendows系统数据和算法数据结构和- 算法
- 主要学习常用数据结构的特性以及算法的思想
- 不依赖于具体的操作系统,支持unix/linux/windows系统
- 不依赖于具体的编程语言,支持c/c++/java/…
Unix/linux系统下士的高级c语言编程
- 主要学习常用的API(Application Programming Interface)函数及系统原理;
- 依赖于具体的操作系统,支持Unix/linux系统;
- 依赖于具体的编程语言,一般使用c语言的标准语法;
目前主流的操作系统:Unix/linux/windows系列
- windows系统:XP/vista/win7/win8/win8.1/win10
- 目前主流的移动终端操作系统:android/ios/windows phone
1.2 uc课程内容的简介
- (1)Unix/linux系统的基本概述和编程基础
- (2)Unix/linux系统下的内存管理技术
- (3)Unix/linux系统下的文件管理和目录操作
- (4)Unix/linux系统下的进程管理技术
- (5)Unix/linux系统下的信号处理技术
- (6)Unix/liunx系统下的进程间通信技术
- (7)Unix/linux系统下的网络编程技术
- (8)Unix/linux系统下的多线程开发技术
本节内容:
- (1)Unix和linux系统的简介
- (2)gcc编译器的使用
- (3)多文件结构的编程
- (4)常用的预处理指令
1.Unix和linux系统的简介
1.1 Unix系统的简介
在1969年左右,编程操作系统使用的是汇编语言,无论是编写还是维护都很不方便,贝尔实验室中的肯-汤普逊在很多语言的基础上研发里B语言,后来贝尔实验室中的丹尼斯-里奇在B语言的基础上做里修改和扩展,改名为New B语言,后来改名为C语言;
c语言诞生于1972年,至今在编程语言排行榜上依然占据很重要的地位;
Unix系统诞生于1970年,具有支持多用户、多任务以及多种处理器的特点;
1.2 linux系统的简介
- linux系统是一款自由免费开放源代码的类Unix系统;
- 当前系统环境:ubuntu 16.04版本 32位的操作系统
- 每半年发布一个新版本,分别是4月和10月
2 gcc编译器的使用
2.1 基本概念
gcc的原名叫做GNU C Compiler(编译器),支持C语言的编译,后来对该编译器做了拓展,支持里了更多语言的编译,如C++等,于是改名为GNU C Collection(集合);
2.2 基本功能
目前主流的开发都使用高级语言(C、C++、java等),高级语言编写的代码是无法被计算机执行,此时需要先将高级语言代码翻译成汇编语言,然后再将汇编语言翻译成机器指令,最后通过链接生成最后的可执行文件,此时该可执行文件可以被计算机执行;
gcc编译器主要用于实现上述过程,通过编译链接来生成最终的可执行文件,具体过程分为以下4步:
(1)预处理/预编译cc -E 生成.i文件
=>主要用于实现头文件的扩展以及宏的替换等;
(2)编译 ——cc -S 生成.s文件
=>主要用俩将高级语言代码翻译成汇编语言,得到汇编文件
(3)汇编——cc -c 生成.o文件
=>主要用于将汇编语言翻译成计算机指令,得到目标文件
(4)链接——cc 生成.out文件
=>主要用于将目标文件和库文件连接,生成可执行文件
练习:
gcc/cc -E 01hello.c -o 01hello.i
gcc/cc -S 01hello.c/01hello.i
gcc/cc -c 01hello.c/01hello.i/01hello.c
gcc/cc 01hello.o/01hello.s/01hello.o/01hello.c
2.3 常用的编译选项
gcc/cc -E :预编译,缺省输出到屏幕,使用-o选项来指定输出文件(.i文件)
gcc/cc -S :编译,将高级语言文件翻译成汇编语言文件(.s文件)
gcc/cc -c :汇编,将汇编语言文件能汇编成机器语言文件(.o文件)
gcc/cc -o :指定输出文件名
gcc/cc xxx.c :编译 + 链接,默认生成a.out
(2)要熟悉的选项
gcc/cc -std 用于指定c语言的执行标准
gcc/cc -v 用于查看gcc的版本信息
gcc/cc -Wall(warnning all) 用于尽可能显示所有警告信息
gcc/cc -Werror 用于警告当作错误处理
(3)了解的选项
gcc/cc -g 用于生成调试信息,可以进行gdb调试
gcc/cc -x 显示指定源代码的编程语言
gcc/cc -0 用于进行优化处理
(4)扩展的选项
man
如:man gcc/cc 查询有关gcc的详细信息
作业:安装英文词典 - 星际译王
2.4 编程相关的常用文件后缀
.h - 头文件 .c 源文件
.i - 预处理文件 .s - 汇编文件
.o - 目标文件
.a - 静态库文件 .so - 共享库文件
3.多文件结构的编程
3.1 多文件结构的主要组成
.h 头文件,主要存放函数声明、结构体的定义等;
.c 源文件,主要存放函数定义、变量的定义等;
.a 静态库文件,主要实现对功能模块的打包等;
.so 共享库文件,主要实现对功能模块的打包等;
... ...
3.2 头文件的详细组成(重中之重)
(1)头文件卫士
#ifndef ...
#define ...
#endif ...
(2) 包含其他头文件
#include <stdio.h>
... ...
(3)进行宏定义
#define PI 3.14
... ...
(4)结构体的定义以及对数据类型起别名
struct node {
int data;//记录数据元素
struct node *next;//记录下一个节点的地址
};
typedef struct node Node;
(5)外部变量和函数的声明
extern int num;//外部变量声明
void show(void);//函数声明
如:
a.c #include"ll.h"
void show(void) {}
b.c #include"ll.h"
void show(void) {}
cc a.i b.i =>重定义的错误
注意:
变量和函数的定义不要写在头文件中,因为一个头文件可能被多个源文件包含,写在头文件中的定义也会因此被预处理器扩展到多个包含该文件的头文件中,并且在编译阶段会被编译到不同的目标文件中,这将直接引发重定义的连接错误;
链写:
创建add目录,在add目录中编译以下3个文件;
add.h 声明一个计算俩个int 类型参数和并返回的函数, 函数名称叫做add_int;
add.c 定义上述函数;
main.c 要求在main函数中调用add_int计算20和30之间的和并打印出来