大程序

.把函数原型放在一个头文件中(.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

.运行图片:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值