• 头文件中的宏定义


    头文件中的宏定义

     

    代码:

    复制代码
     1 #ifndef DSP_ADC_BSP_H_    //防止头文件被重复包含
     2 #define DSP_ADC_BSP_H_
     3 
     4 #ifdef _DSP_ADC_BSP_C_   //判断是否被定义了
     5 #define ADCBSPEXT         //定义时执行
     6 #else
     7 #define ADCBSPEXT extern //未定义时执行
     8 #endif //_DSP_ADC_BSP_C_
     9 ADCBSPEXT int a;
    10 ADCBSPEXT void InitileAdc(void);
    11 ADCBSPEXT void CaptureAdcInt();
    12 ADCBSPEXT unsigned char CaptureAdcInt_data();
    13
    14 #endif /* DSP_ADC_BSP_H_ */
    复制代码

    解释:

    第1、2行和第14行:防止重复包含。

    #ifndef DSP_ADC_BSP_H_  //如果DSP_ADC_BSP_H_没有被定义,则执行以下
    #define DSP_ADC_BSP_H_ //定义DSP_ADC_BSP_H_
    ...
    #endif /* DSP_ADC_BSP_H_ */ //注解是给程序员指明对应的#ifndef指令。

    同一个文件,在首次包含这个文件时,没有定义宏DSP_ADC_BSP_H_,预处理器允许保留#ifndef和#endif之间的多行内容。

    如果再次包含此文件,预处理器将把#ifndef和#endif之间的内容删除。

    意思是文件包含的头文件中又同时包含了该.h文件,该文件只会定义一次。

    第3~12行:提供只在一个.h文件中定义一次就可以在别的模块中使用外部函数与变量的方法。(别的文件需要包含该头文件)

    首先说明一下extern:

    extern int i;

    extern的用法:

    1、变量

    extern int a;//声明一个全局变量a

    int a; //定义一个全局变量a

    extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。

    int a =0;//定义一个全局变量a,并给初值,

    该声明编译器提供的信息是,i 是int型变量 但是编译器不会为i分配存储单元。上述声明不是变量的定义,而是提示编译器需要访问定义在别处的变量。

    变量在程序中可以多次声明,但只能有一次定义。

    2、函数

    extern  int func(void);

    int func(void);   含义一样

    对于函数来说,没有实体默认为声明

    extern可有可无

    下面是正题:

    复制代码
    #ifdef _DSP_ADC_BSP_C_   //判断_DSP_ADC_BSP_C_是否被定义
    #define ADCBSPEXT //如果定义了执行,ADCBSPEXT为空白
    #else
    #define ADCBSPEXT extern //如果没有定义执行,ADCBSPEXT为extern
    #endif
    ADCBSPEXT int i;
    ADCBSPEXT void InitileAdc(void); //函数的声明中,ADCBSPEXT可有可无,习惯加上。
    ADCBSPEXT void CaptureAdcInt();
    ADCBSPEXT unsigned char CaptureAdcInt_data();
    复制代码

    在与之对应模块的.c文件中会有这么一句话:

    #define _DSP_ADC_BSP_C_ //定义了_DSP_ADC_BSP_C_ 

    那么当为本模块.c文件时,ADCBSPEXT替换为空白。

    声明就是:

    int a;
    void InitileAdc(void); void CaptureAdcInt(); unsigned char CaptureAdcInt_data();

    当为其他.c文件用到这些函数式、外部变量,就需要包含这个头文件,而其中的ADCBSPEXT替换为extern以提供使用。

    extern int a;
    extern void InitileAdc(void); extren void CaptureAdcInt(); extern unsigned char CaptureAdcInt_data();

      

    这种用法既防止了重复包含,也防止了变量重复定义的错误,外部变量、外部函数也只仅仅在一个头文件中声明,而其他文件只仅仅包含该文件即可。

    这个方法也间接的方便了工程的管理。

  • 相关阅读:
    Java 猜字谜游戏
    Java中private、protected、public和default的区别
    Java JRT
    Java 数组
    javascript中的bind()方法
    2018-07-31 javascript中对的apply,call
    2018年7月31日
    【转载】javascript回调函数
    函数return以及lodash中的extend,each,map方法
    css实现动态相对居中
  • 原文地址:https://www.cnblogs.com/88--88/p/10030378.html
Copyright © 2020-2023  润新知