预处理
1、内存的分区
进程:可执行文件 从运行到结束 整个动态的过程 就叫进程。(占内存空间) 在32位平台 每一个进程 占4G空间(虚拟空间)

2、变量的了解
1、普通局部变量
定义形式:在{}里面定义的 普通变量 叫普通局部变量
1 void test02()
2 {//复合语句
3 int num = 0;//num 局部变量
4 {
5 int data = 0;//data 局部变量
6 }
7 }作用范围:所在的{}复合语句之间有效
生命周期:所在的{}复合语句之间有效
存储区域:栈区
注意事项:
1、普通局部变量 不初始化 内容 不确定
2、普通局部变量 同名 就近原则(尽量别同名)
2、普通全局变量
定义形式:在函数外定义的普通 变量
1 int data = 10;//普通全局变量
2 void test03()
3 {
4
5 }作用范围:当前源文件以及其他源文件 都有效。
生命周期:整个进程。
存储区域:全局区
注意事项:
1、全局变量不初始化 内容为0
2、全局变量 和 局部变量 同名 优先选择局部变量。
3、其他源文件 使用全局变量 必须对全局变量 进行extern声明。(变量的使用所在的源文件)
extern 声明外部可用。该变量或函数 来自于其他源文件。
3、静态局部变量
定义形式:在{}加static定义的局部变量 就叫静态局部变量\
1 void test04()
2 {
3 int data1 = 10;//普通局部变量
4 static int data2 = 20;//静态局部变量
5 }作用范围:所在的{}复合语句之间有效
生命周期:整个进程有效
存储区域:全局区
注意事项:
1、静态局部变量不初始化 内容为0
2、静态局部变量 整个进程 都存在(第一次定义有效)
4、静态全局变量
定义形式:在函数外 加static修饰定义的变量 就是静态全局变量
1 int data3 = 10;//普通全局变量
2 static int data4 = 20;//静态全局变量
3 void test05()
4 {
5
6 }作用范围:只能在当前源文件使用 不能在其他源文件使用。
生命周期:整个进程
存储区域:全局区
注意事项:
1、静态全局变量不初始化 内容为0
2、静态全局变量 只能在当前源文件使用
3、全局函数和静态函数
全局函数:在当前源文件 以及其他源文件 都可以使用
如果其他源文件使用需要 extern对全局函数 进行声明
静态成员 只能在当前源文件 用
static void func(void){}4、gcc 编译的过程
编译的过程:预处理、编译、汇编、链接
预处理:宏替换、删除注释、头文件包含、条件编译 -E (不会报语法错误)
gcc ‐E hello.c ‐o hello.i 1、预处理编译:将预处理后的文件 编译成 汇编文件 (报语法错误)
gcc ‐S hello.i –o hello.s 2、编译汇编:将汇编文件 生成 二进制文件
gcc ‐c hello.s ‐o hello.o 3、汇编链接:将工程的二进制文件 +库函数+启动代码 生成可执行文件
gcc hello.o ‐o hello_elf 4、链接一步到位:
gcc main.c ‐o main
gcc main.c5、头文件包含
头文件包含:在预处理 结果 将头文件的内容 原封不动的 包含在 目的文件中
#include <head.h> 建议<>包含系统头文件
<>从系统指定目录 寻找head.h头文件
#include "head.h" 建议""包含自定义头文件
“”先从当前目录 寻找head.h头文件 如果找不到 再到系统指定的目录下寻找
6、宏
使用关键字 define 定义 叫宏
#define PI 3.14 //(宏定义)在预处理结果 使用3.14 替换所有出现PI的位置 (宏展开)
注意:不要再宏后加;分号
宏 尽量 大写 和 普通变量 区分开
1、不带参数的宏
1 #define PI 3.14 (宏定义)
2 #define MY_STR "hello world"
3 #define N 1002、带参数的宏
1 #define MY_MUL(a, b) a*b
2
3 printf("%d\n", MY_MUL(10,20) );//10*20
4 //printf("%d\n", 10*20 );1、宏的参数不能有类型
2、宏不能保证参数的完整性
3、宏不能作为结构体、类的成员
1 #define MY_MUL(a, b) a *b
2 #define MY_MUL2(a, b) ((a) * (b))
3 printf("%d\n", MY_MUL(MY_MUL2(10+10, 20+20), MY_MUL(10+10, 20+20)));
4 MY_MUL2(10+10, 20+20) *MY_MUL(10+10, 20+20)
5 ((10+10) * (20+20))*10+10 *20+20
6 20*40*10+10*20+20== 8000+200+20== 82207、 条件编译

代码裁剪
1 #include <stdio.h>
2 #include <string.h>
3 void test01()
4 {
5 char str[128] = "";
6 fgets(str, sizeof(str), stdin);
7 str[strlen(str) ‐ 1] = '\0';
8
9 int i = 0;
10 while (str[i] != '\0')
11 {
12 #ifdef MAX_TO_MIN
13 //将大写字母转换小写字母
14 if (str[i] >= 'A' && str[i] <= 'Z')
15 {
16 str[i] += 32;
17 }
18 #else
19 //将小写字符转换成大写字母
20 if (str[i] >= 'a' && str[i] <= 'z')
21 {
22 str[i] ‐= 32;
23 }
24
25 #endif
26 i++;
27 }
28
29 printf("%s\n", str);
30
31 return;
32 }
33 int main(int argc, char const *argv[])
34 {
35 test01();
36 return 0;
37 }条件编译 用于防止头文件重复包含 (条件编译方式 推荐)
1 #ifndef __05_A_H__
2 #define __05_A_H__
3
4 int num=10;
5
6 #endif条件编译 用于防止头文件重复包含 (windows的方式)
1 #pragma once
2 int num=10;8、动态库和静态库
1、库的介绍
库:将源文件生成 二进制文件 只需要链接 就可以生成可执行文件

2、制作静态库
1 gcc ‐c fun.c ‐o fun.o
2 ar rc libtestlib.a fun.o静态库libtestlib.a 是以lib开头 .a结尾 中间才是库的名称testlib
静态库使用:库和工程在同一目录
sudo gc main.c libtestlib.a静态库使用:库和库的头文件在 自定义目录(推荐)
1 sudo gcc main.c ‐I./lib ‐L./lib ‐ltestlib
1 ‐I后面跟头文件的路径
2 ‐L后面跟库的路径
3 ‐l后面跟库的名称(lib和.a之间的名称)静态库使用:库和库的头文件在 系统目录
将库拷贝 将头文件拷贝到/usr/include下
3、制作动态库
gcc ‐shared fun.c ‐o libtestlib.so动态态库使用:库和工程 在同一目录
将当前路径./添加到库的搜索目录 就可以
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
动态态库使用:库在自定义目录
将当前路径./lib添加到库的搜索目录 就可以
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
阿源的知识库