全局变量

全局的生命周期,作用域
与任何函数无关,任何函数都可以使用全局变量

未初始化的全局变量,默认值0,指针指向NULL
只能编译时刻已知的值来初始化全局变量
初始化发生在main函数之前

1
2
3
4
//错误示例
int all = 12;
int g = all;
int fun = f(x);

编译预处理

#开头的是编译预处理指令

1
2
#include <xxx.h>
#include <xxx.c>

define 宏

纯文本替换

1
2
3
4
5
6
7
8
#define PI 3.14159
#define PI2 2*PI // pi *2
#define FORMAT "%f\n"

int main(){
printf(FORMAT, PI2*0.5);
}

gcc 查看编译过程文件
gcc 文件名 –save-temps
.c -> .i -> .s -> .o -> .out

预定义宏

__LINE__
__FILE__
__DATE__
__TIME__
__STDC__

带参数的宏

一切都要括号
整个值要括号
参数出现的每个地方都需要括号
1
#define cube(x) ((x)*((x)+1)+(x))

大程序结构

创建项目
一个.c文件是一个编译单元
编译器每次编译只处理一个编译单元

头文件

函数原型

1
2
3
4
5
6
7
8
9
#include "max.h"
int max(int a, int b);

//报错
double max(double a, int a);

int main(){
printf("%d\n", max(a,b));
}

indlude “”和<>的区别

“” 当前目录查找,未找到查找系统指定目录
 <>  只在系统指定目录查找

static

不对外公开的函数,变量
只能在所在的编译单元中被使用的函数,全局变量

全局变量申明

只有申明可以放在头文件中
1
2
3
4
5
6
7
8
//max.h
int max(int a, int b);
extern int gAll;

//main.c
int main(){
printf("%d\n", max(gAll,12));
}

重复定义,引用

标准头文件结构
1
2
3
4
5
6
#ifndef __MAX_H__
#define __MAX_H__

...

#endif