zoukankan      html  css  js  c++  java
  • 关于#ifdef #ifndef

    https://www.cnblogs.com/agnily/p/5848768.html

    1、先看#ifdef的用法:

    复制代码
    #define   KEY1_PA0
    
    #ifdef    KEY1_PA0
    -------------第一段-----------------
    #define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOA
    #define               macKEY1_GPIO_PORT                     GPIOA              
    #define               macKEY1_GPIO_PIN                        GPIO_Pin_0
    
    #else    //KEY2_PC13
    -------------第二段-----------------
    #define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOC
    #define               macKEY1_GPIO_PORT                     GPIOC          
    #define               macKEY1_GPIO_PIN                        GPIO_Pin_13
    
    #endif
    复制代码

    如果定义过 KEY1_PA0,就执行第一段代码,否则就执行第二段代码!!

    2、#ifndef的用法:

    在文件bsp_usart1.h中:

    #ifndef __USART1_H
    #define    __USART1_H
    
    //statement.
    
    #endif  // usart1.h

    如果没有define过__USART1_H,就执行下面的语句;如果定义过,就不执行;

    所以在一个.c文件里面,多次调用到该文件的时候,就相当于只调用一次。

    这是头文件的常用写法!!

    比如:

    在文件main.c中:

    #include "stm32f10x.h"
    
    #include "bsp_usart1.h"

    在bsp_usart1.h中:

    #include "stm32f10x.h"

    在stm32f10x.h中:

    #ifndef __STM32F10x_H
    #define __STM32F10x_H
    
    #endif

    分析:

    (1)、在main.c中调用了一次文件stm32f10x.h,调用的时候发现__STM32F10x_H并没有被define,所以就执行#ifndef - #endif之间的代码,

    执行过后,就相当于define了__STM32F10x_H;

    (2)、当在bsp_usart1.h中再次调用文件stm32f10x.h的时候,发现__STM32F10x_H已经被define过了,所以这时就不再执行#ifndef - #endif 之间的代码了!

    如果没有#ifndef的话,在这里,stm32f10x.h文件里面,如果有定义变量之类的,就会报重定义的错误。

    所以这种写法的作用有:防止重复定义!!

  • 相关阅读:
    贵有恒
    二叉树的中序遍历
    001.3或5的倍数
    静态成员的语法总结及应用-单例模式
    力扣42题(接雨水)
    算法笔记之二分查找
    素数筛算法之寻找每个数的最小素因子
    素数筛的算法感悟
    一维数组的逆序存放问题
    关于c++入门的几个基本代码之求和
  • 原文地址:https://www.cnblogs.com/focus-z/p/10260164.html
Copyright © 2011-2022 走看看