.把函数原型放在一个头文件中(.h结尾)中,再需要调用
这个函数的源代码(.c文件)中 #include 这个头文件,就
能让编译器在编译时知道函数的原型
.gcc编译多个 .c 文件:
.gcc a.c b.c …
.#include " " 还是<>
.#include 有两种形式来指出要插入的文件
.""要求编译器首先在当前目录(.c文件所在的目
录)查找这个文件,如果没有,再到编译器指定的目
录中查找
.<>让编译器只在指定的目录中查找
.编译器知道自己的标准库的头文件在哪里
.环境变量和编译器命令行参数也可以指定寻找头文件
的目录
.#include 的误区
.#include 是用来引入库的.实际上它是将包含的文件全
部插入到该语句的位置
.stdio.h里只有printf的原型,printf的代码在另外的地方,
某个.lib(Windows) 或.a(Unix)中
.现在的C语言编译器默认会引入所有的标准库
.#include <stdio.h>只是为了让编译器知道 printf 函数的原
型,保证你调用时给出的参数值是正确的类型
.头文件
.在使用和定义这个函数的地方都应该#include这个头文
件
.一般的做法就是任何 .c 都有对应的同名的.h,把所有对
外公布的函数的原型和全局变量的声明都放进去
.不对外公开的函数
.在函数前面加入static就使得它成为只能在所在的编译单
元中被使用的函数
.在全局变量前面加上static就使得它成为只能在所在的编
译单元中被使用的全局变量[只能在定义该全局变量
的.c文件中使用]
.static函数与普通函数的区别:
.static函数与普通函数的作用域不同,static函数
仅在定义该函数的文件中有用.所以只在当前文
件中使用的函数应该声明为内部函数(static修饰
的函数),内部函数应该在当前源文件中说明定
义.对于可在当前源文件以外使用的函数,应该
在一个头文件中说明,要使用这些函数的源文件
要包含这个头文件
.static函数在内存中只有一份,普通函数在每个被
调用中维持一份拷贝
.在多个.c文件中想要使用同一全局变量时,在头文件中使
用extern对全局变量声明,则可对该全局变量进行全文件
访问.
.变量的声明:
.int i; 变量的定义
.extern int i; 变量的声明,不能初始化,因为声明时
不会产生代码.
.声明和定义:
.声明是不产生代码的东西
.函数原型
.变量声明
.结构声明
.宏声明
.枚举声明
.类型声明
. inline 函数
.定义是产生代码的东西
.头文件
.只有声明可以被放在头文件中
.是规则不是法律
.否则会造成一个项目中有多个编译单元里有同名的函数
或者用weak修饰符来强调这种存在
.重复声明
.同一个编译单元中,同名的结构不能被重复声明
.如果你的头文件里有结构的声明,很难这个头文件不会
在一个编译单元里被#include多次
.如有两个头文件时,一个头文件包含了另一个头文
件,而另一个头文件中有结构的声明,当main函数
需要同时包含两个.h文件时,结构就会被重复声明
.所以需要"标准头文件结构"
.标准头文件结构:
.#ifndef __ LIST _HEAD __
#define __ LIST HEAD __
#include " node.h "
typedef struct node{
Node* head;
Node* tail;
}List;
#endif
.运行这个条件编译和宏,保证这个头文件在一个编译
单元中只会被#include 一次
.#pragma once 也能起到相同的作用,但是不是所有
的编译器都支持.[gcc并不支持,visual staio支
持]
.代码演示
.main.c
#include <stdio.h>
#include "max.h"
/*
{
#ifndef __MAX_H__
#define __MAX_H__
int max(int a, int b);
extern int gALL;
struct Node
{
int value;
char* name;
};
#endif
}
*/
#include "main.h"
/*
{
#ifndef __MAIN_H__
#define __MAIN_H__
#include "max.h"
{
#ifndef __MAX_H__
#define __MAX_H__
int max(int a, int b);
extern int gALL;
struct Node
{
int value;
char* name;
};
#endif
}
#endif
}
*/
int main(int argc, char const *argv[])
{
int a = 10;
int b = 20;
printf("%d\n", max(a, gALL));
return 0;
}
.max.c
#include "max.h"
int gALL = 20;
int max(int a, int b)
{
int result = a;
if( a < b )
result = b;
return result;
}
.max.h
#ifndef __MAX_H__
#define __MAX_H__
int max(int a, int b);
extern int gALL;
struct Node
{
int value;
char* name;
};
#endif
.main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include "max.h"
#endif
.运行图片: