头文件的作用
通常,一个常规的C语言程序会包含多个源码文件(.c),当某些公共资源需要在各个源码文件中使用时,为了避免多次编写相同的代码,一般的做法是将这些大家都需要用到的公共资源放入头文件(.h)当中,然后在各个源码文件中直接包含即可。
头文件的内容
- 头文件中所存放的内容,就是各个源码文件的彼此可见的公共资源,包括:
- 全局变量的声明(也可以定义【谨慎赋值】,但是不建议)。
- 普通函数的声明(告诉编译器函数的参数以及返回类型【接口的模型】)。
- 静态函数(被static修饰的函数可见范围为本文件)的定义。
- 宏定义。
- 结构体、联合体的声明。
- 枚举常量列表的声明。
- 其他头文件
基础语法规则:
#ifndef __头文件名_H__ // 条件编译, 判断宏 __头文件名_H__ 是否没有定义
#define __头文件名_H__ // 定义宏 __头文件名_H__
#endif //条件编译语句的结束
注意:
-
- 头文件的格式 #ifndef #define 的作用是为了防止头文件被多次重复包含而造成重复定义的问题
- 编译器在编译程序的时候会主动去寻找头文件而他默认寻找的路基有以下几个:
如果希望编译器在我们指定的路径下去寻找头文件则需要在编译命令后面指定头文件寻找的路径:
gcc hello.c -I./ -v // -I 则是告诉编译器 头文件寻找的路径 ./ 为当前路路径
// -v 显示编译器的版本信息以及一些编译选项 【一般不需要添加】
头文件的基础格式实例:
#ifndef __MY_TYPES_H_ // 判断是否没有定义 __MY_TYPES_H_ ,用于防止头文件被多次包含
#define __MY_TYPES_H_ // 配合上一句一起使用
// 宏定义
#define PI 3.14
// 声明外部变量 a (告诉编译器 a 是整形的, 而且它是在其他文件中定义了你不需要担心)
extern int a ;
// 如果想在头文件中定义全局变量那么注意不要对她进行赋值,
// 如果赋值了那么在项目编译阶段很有可能会出现重复定义的问题
int b ;
// int c = 100 ; // [报错] multiple definition of `c'
// 枚举常量列表声明
typedef enum Stat { open , running , stop , sleep } stat ;
// 联合体类型声明
typedef union info
{
int Num ;
char Type;
float Abc;
}Info ;
// 结构体的声明
struct MyTypes
{
char Name [32];
stat Test ;
Info TestInfo ;
};
// 静态函数的定义
/*
* 函数名字:FuncA
* 函数功能:xxxxxx描述该函数的作用
* 函数参数:
* @a xxx该参数的作用
* @b xxx该参数的作用
* @d xxx该参数的作用
* 函数的返回值:
* 成功:
* 失败:
* 作者:
* 修改时期:
* 修改内容:
*/
static void FuncA( int a , char b , double d )
{
printf("a:%d _%s_%s_ \n" , a , __FUNCTION__ , __FILE__ );
}
#endif // 结束整个头文件的判断语句
如何妥善把项目分成多个文件
对应以上工程我们如何编译:
gcc src/mian.c src/Input.c src/Output.c -o ./bin/main -I./inc -lc -lgcc
gcc src/*.c -o ./bin/main -I./inc // src/*.c 指的是编译 src内的所有 .c 文件
gcc // 需要使用的编译器
src/mian.c // 需要编译的源文件 1
src/Input.c // 需要编译的源文件 2
src/Output.c // 需要编译的源文件 3
-o // 指定在特定的路径下生成指定文件名
./bin/main // 生成目标文件的 路径 + 文件名
-I./inc // -I include 指明头文件的路径
-L./lib // -L 指明链接库的文件路径
-lc // -l 指定需要链接的库文件的名字 为 c 库 全称【libx.so】
-lgcc // -l 指定需要链接的库文件的名字 为 gcc 库 全称【libgcc.so】
暂时也可以使用简单的 “shell 脚本文件” 来帮助我们编译:
gcc src/*.c -o ./bin/main -I./inc // 编译命令
./bin/main // 执行程序的命令
其他的操作:
C语言显示字体颜色等操作:
示例:
printf("\33[42;31;4m \33[10;30H %s\033[0m\n", Name[i]);
\33[ 开始设置
42; 背景色
31; 字体颜色
4m 下划线
\33[10;30H 设置光标的位置 y=10 x=30
%s 需要输出的数据
\033[0m 设置结束