关于#ifdef #ifndef

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文件里面,如果有定义变量之类的,就会报重定义的错误。

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

时间: 2024-11-10 03:37:13

关于#ifdef #ifndef的相关文章

C/C++预处理指令#define,#ifdef,#ifndef,#endif…

本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 本来只是想了解一下#ifdef,#ifnd

C/C++预处理指令#define,#ifdef,#ifndef,#endif… (转)

本文转自博文C/C++预处理指令#define,#ifdef,#ifndef,#endif….这篇博文写得特别好,特转载. 本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #en

C++ #if #endif #define #ifdef #ifndef #if defined #if !defined详解

首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句 #ifndef _MYHEADFILE_H #define _MYHEADFILE_H // .......语句...... #endif // _MYHEADFILE_H 为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含 _MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H , #endif 与#ifndef 首尾呼应,表示结束. 说到这里,我们

C语言的#if #ifdef #ifndef

#if #ifedf #ifndef   -般情况下,C语言源程序中的每一行代码.都要参加编译.但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译! 条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分, 条件编译里面有判断语句,比如 #if .#else .#elif 都由#endif结束 它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段

【C++】预处理指令#define,#ifdef,#ifndef,#endif ...

C/C++预处理指令#define,#ifdef,#ifndef,#endif… https://www.cnblogs.com/zi-xing/p/4550246.html 原文地址:https://www.cnblogs.com/gdut-gordon/p/10922812.html

条件编译#ifdef的妙用详解_透彻

这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句.     条件编译命令最常见的形式为:     #ifdef 标识符     程序段1     #else     程序段2     #endif          它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序

条件编译#ifdef的妙用详解

c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏#undef            取消宏的定义 #if                   编译预处理中的条件命令,相当于C语法中的if语句#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句#ifndef            与#ifdef

C++中 #ifdef的妙用详解

本文主要介绍c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏#undef            取消宏的定义 #if                   编译预处理中的条件命令,相当于C语法中的if语句#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句#ifndef            与

预处理器

本文是对C++预处理器的学习整理,参考了网站www.learncpp.com相关章节的内容. 一.概述 代码在编译之前需要通过预处理器进行预处理,预处理器运行时,逐行扫描代码寻找预处理指令.预处理指令是以#开头.换行符结尾(不是分号:)的代码. 预处理器主要实现一下三个功能: 1. include 2. macro define 宏定义. 3. 条件编译 二.include 故名思意,#include用于包含头文件,预处理器在遇到#include 指令时,将相应头文件的内容复制到指令所在的位置.