有趣的预编译
编写大型程序
头文件:变量的声明,函数的声明,宏的定义,预编译指令
include 库函数 include <xx.h> 找库函数的路径
include 自己的头文件 include "xx.h", 先找当前目录
gcc --verbose main.c
gcc -I. include当前目录
头文件的重复包含
标准头文件结构
#ifndef xx
#define xx
#endif
#pragma once 也能起到类似作用 但不是被所有编译器都支持
头文件中不要定义函数
两个编译单元同时引用的话,会导致重复定义的错误
static
告诉编译器符号不要泄漏到文件外
块外声明的static变量 声明它只是文件内可见 多个编译单元看到的同名的块外静态变量不是同一份
块内声明的static变量 存储期由自动变为静态(存放在静态数据区,而不是每次调用函数的时候在
栈上占空间)
只在程序执行前进行一次初始化
其他块不可见
离开块无限期保留其值
如果在两个文件里面定义了重名的函数 能够分别编译 但链接会出错
修改的方法是,在头文件中定义的函数加上static修饰,这样两个.c文件在链接时也不会出错
两个编译单元内都各自有一个相同名字的函数存在,但在编译单元外都不可见
extern
可以使多个源文件共享一个变量
IO
流重定向
./main > a.txt
./main < b.txt
文本文件输入输出函数家族
getchar 字符输入
putchar 字符输出
gets 文本行输入
puts 文本行输出
scanf 格式化输入
printf 格式化输出
二进制文本的模式字符串
fwrite 二进制输出
fread 二进制输入
fseek