C程序组成:
一个C语言源程序是由多个.c和.h组成的
.c : C语言源代码文件
.h : 头文件
.C文件的组成
(1) 头文件包含部分
#include : 包含命令
作用是把后面的那个文件的内容在此处展开。
#include <stdio.h>
#include "filename.h"
<> 与 “” 有什么区别? 搜素路径不同
#include 后面只是指定了文件名,并没有指定文件的保存路径,
那么咱们的编译器到哪里去找到这个.h文件呢?
<> : 到标准的搜索路径下面去找
如:
/usr/include/
“” : 先到工程指定的路径下面去找,如果没有找到,
那么再标准搜索路径下面去找。
如果编译工程代码时候,并没有指定搜索,那么它将默认是当前路径。
(2) 宏定义
宏定义: 定义一个宏
宏: 是一个替换别人的东西的东西。
宏有两种:
a、不带参数的宏
#define 宏名 要替代的内容
如:
#define PI 3.1415
#define LED_ON 0
.....
#define M 3
#define N 4
b、带有参数的宏
#define 宏名(参数列表) 要替代的内容
“参数列表” : 在宏定义的参数,不需要类型
如:
写一个宏,用来表示两个整数之间较大的那一个!
#define MAX(a, b) (a) > (b) ? (a) : (b)
int main(int argc, char ** argv)
{
int m = MAX(3, 4);
}
c、宏的作用
(a) 替换
仅仅替换,不会额外增加()等
不作词义分析
(b) 宏有一个宏名,“字面意思”
(3) 声明部分
声明: C语言的声明是指把一个符号(标识符)与一个对象或类型关联起来。
告诉编译器,这个符号它是一个什么东西。
外部变量的声明:
语法:
extern 外部变量的类型 外部变量名;
外部函数的声明:
语法:
extern 外部函数的返回值类型 函数名(参数类型列表);
1.c 2.c
需要用到1.c中定义函数sum
extern int sum(int , int ) ;
int sum(int a, int b)
{
return a+b;
}
类型的声明或定义:
自定义类型的作用域 最大就是本文件中生效。
1.c 2.c
需要用到1.c中的 struct test
如果需要用到一模一样的,那么
咱们需要在2.c中定义一个同样的
struct test
{
int a;
char c;
};
(4) 全局变量以及函数的声明
int a = 5;
(5) 函数的具体实现
int main()
{
.....
}
int sum(int a. int b)
{
return a+b;
}
总结:
C语言源代码文件是由函数组成的,C语言的指针必须写在函数内部,
一个.c文件,可以由多个函数组成,一个工程可以由多个.c组成,
但是一个.c 或者 一个工程 有且仅有一个main函数,这个main函数
就是程序的入口,main函数结束,程序就执行完毕
.h文件的组成
.h 接口文件一般会包含一些声明:
函数声明
类型声明或定义
宏定义
…
头文件中一般不包含代码的实现,因为它只是一个接口文件。
注意:
头文件不能够重复包含。
为了防止头文件被重复包含引发重复定义的问题。
头文件的编写规范如下:
xxx.h
#ifndef __XXX_H__
#define __XXX_H__
//...头文件的具体的内容
#endif
如:
#ifndef __HEAD_H__//格式__XXXXX_X__
#define __HEAD_H__
#define Num(a) sizeof(a)/sizeof(a[0])//求数组a的元素个数
#define Get_Bit(x,n) (x>>n)& 1//求整数x中第几位nbit
#define MAX(a,b) (a)>(b)?(a):(b)//比较两数大小
int Sum_number(int a, int b);//求两数之和
#endif
头文件的引用的原则:谁用谁包含