9.宏与头文件

test.h 
//防止重复包含头文件和防止重定义
#ifndef  _TEST_H_
#define  _TEST_H_

#define  DEBUG  0
#define BUF_SIZE  1024
int GetNum();//调用外部定义函数时,在函数调用前进行extern声明就可以,extern可以省略

#endif




test.c
/********************************************************************************************
* Module Name               :模块化代码
* Module versions        :模块版本
* Module Date            :2016/08/05
* Student:007
* Description               :说明书
* Others                    :合作其他人
* Revision History    :修订历史
********************************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//标准输入输出库
#include<stdlib.h>//系统库
#include<string.h>

#include"test.h"

char acBuf[BUF_SIZE];
static int s_iNum;//外部变量声明,不是定义;声明不占内存,可以重复声明;告诉编译器到外部文件去找定义
//(整个解决方案找)
//全局变量共享的方式,不建议;1影响模块独立性
#if DEBUG
int GetNum()
{
return s_iNum;
}
#endif

void SetNum(int iNum)
{
s_iNum = iNum;
}


main.c

/********************************************************************************************
* Module Name               :模块化代码
* Module versions:模块版本
* Module Date:2016/08/05
* Student:007
* Description               :说明书
* Others:合作其他人
* Revision History:修订历史
********************************************************************************************/
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>//标准输入输出库
#include<stdlib.h>//系统 库

#include"test.h"


int GetTimes();

static int g_iCnt =0;//因为全局变量作用域范围广,故会影响到别的函数和别的源文件,故加专门标识会利于编程



/*=========================
* Function :main
* Description   :主程序,程序最开始运行的地方
* Input Para    :无
* Output Para   :无
* Return Value:有返回值,进程(exe)通信,另外一个进程可以通过这个返回值,判断进程结束
===========================*/
int main()
{
/*
作用域:这种变量的有效范围就称之为该变量的作用域
分为两种变量:局部变量和全局变量
*/
/*
局部变量:函数体内定义的变量,他的作用域仅限于函数内
1、主函数里面定义的变量只能在主函数中使用;主函数也不能使用其他函数中定义的变量
2、形参属于被调函数的局部变量,实参是主调函数的局部变量
3、允许在不同的函数内使用相同的变量名
4、在复合语句中也可以定义变量,其作用域只在复合语句范围
*/
/*
全局变量:函数体外定义的变量,其作用域是整个源程序(整个解决方案)
         全局变量跟局部变量同名:在局部变量作用域范围内,会暂时屏蔽全局变量
*/

/*
动态存储和静态存储
动态存储:运行期间,根据需要进行动态分配存储空间的方式(需求结束就释放)
静态存储:运行期间,分配固定的存储空间的方式(程序运行结束才释放)

动态存储:1、形参 2、局部变量   (函数调用的时候,分配内存,调用 结束就释放内存)3函数入口地址
          动态存储最节约运行内存RAM,所以程序中,应该尽量使用动态存储
静态存储:1、全局变量  2、static
          程序运行开始就被分配了固定内存,直到程序结束才释放内存
  静态存储较为占用运行内存RAM,所以程序中,应该尽量少用
*/
/*
局部变量:auto变量,一般auto是省略
*/
/*
有时,我们需要将局部变量的值在函数调用结束后,不消失,用关键字“static”进行声明
1、在整个程序运行期间,都不会被释放
2、编译的时候,只赋值一次,运行的时候,不再赋值

3、封装静态存储变量,虽然是静态存储,但是仍然局限于一定范围,不影响范围外的其他变量
  静态局部变量:作用域,函数体内
  静态全局变量:作用域,源文件内
  静态函数:作用域,源文件内,(可以防止跟外部函数同名)
*/
/*
统计函数调用的次数
*/
/*
extern 外部变量声明
      如果变量在外部定义的,如果要使用,就用extern进行声明
*/

/*
预编译 #:在编译在语法扫描前进行第一次扫描(类似看书前,看一下目录)
    宏定义#define _CRT_SECURE_NO_WARNINGS
文件包含#include<stdio.h>//标准输入输出库
条件编译
#ifndef _INC_STDIO
#define _INC_STDIO
#end
*/
/*
宏定义:用一个标识符代替一个常数\表达式等
      1、宏不是语句,不需要加分号
  2、“完全替代”
  3、建议,标识符采用全大写  只用于替代常数(如果看到数字或者字符,一般都要想到用宏来替代)

  #define  PI   3.14159

  2*PI*PI

  #define X   3
  #define Y   X+3//凡属替代表达式,都加括号
  #define Y1   (X+3)//凡属替代表达式,都加括号
  y=Y*3=X+3*3=3+3*3=12

*/
/*
文件包含:语法讲,宏定义是完全替代一行;替代多行,能否将一些共同声明(共同变量)用一个文件存储,然后
         采用替代多行的形式,谁使用谁就包含

包含头文件有两种形式:“”和<>
<>去系统目录中寻找头文件,一般系统头文件使用
“”,先到当前目录下寻找头文件,找不到再到系统目录中去寻找,一般自定义头文件使用
*/
/*
条件编译:按照条件判断是否编译某些内容
1、ifdef   标识符  _CRT_SECURE_NO_WARNINGS
       程序段
  #else
       程序段
  #endif
2、ifndef   标识符
       程序段
  #else
       程序段
  #endif 
*/

GetTimes();
GetTimes();
GetTimes();
GetTimes();

printf("函数调用了%d次\n", GetTimes());

system("pause");

return 0;
}
/*=========================
* Function :main
* Description   :主程序,程序最开始运行的地方
* Input Para    :无
* Output Para   :无
* Return Value:有返回值,进程(exe)通信,另外一个进程可以通过这个返回值,判断进程结束
===========================*/
int GetTimes()
{
static int s_iCnt = 0;//编译的时候执行,运行的时候,跳过
s_iCnt++;

return s_iCnt;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值