define的几种情况

define的两种情况:1)只是定义一个变量,不赋任何值,只是一个开关的作用。
                            2)赋予变量一个值,但是不能用等号 
                            3)赋予宏变量另一个宏,但是不能用用#if DEF_EQUAL_VALUE==10 或#if DEF_EQUAL_VALUE 来判断, 而只能 #if defined DEF_EQUAL_VALUE
              错误的情况: 用等号 会出错

// define_Macro.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

#define JUST_DEF   //just be a swith
#define DEF_VALUE 5  //can have value
//#define DEF_EQUAL=10  //will be error
//#define DEF_EQUAL_VALUE   JUST_DEF  //will be error ,because next we have #if DEF_EQUAL_VALUE==10
#define DEF_EQUAL_VALUE   DEF_VALUE
//#define DEF_EQUAL_MACRO=JUST_DEF  //be error
//#define DEF_EQUAL_MACRO  = JUST_DEF   //相当于#define DEF_EQUAL_MACRO  =
int _tmain(int argc, _TCHAR* argv[])
{
#if defined JUST_DEF
    cout<<"JUST_DEF"<<"/n";
#endif
#if DEF_VALUE==1
    cout<<"DEF_VAULE==1"<<"/n";
#else
    cout<<"DEF_VALUE!=1"<<"/n";
#endif
#if DEF_EQUAL_VALUE==10
    cout<<"DEF_EQUAL_VALUE==10"<<"/n";
#else
    cout<<"DEF_EQUAL_VALUE!=10"<<"/n";
#endif
    /*
#if DEF_EQUAL_MACRO==JUST_DEF
    cout<<"DEF_EQUAL_MACRO==JUST_DEF"<<"/n";
#else
    cout<<"DEF_EQUAL_MACRO!=JUST_DEF"<<"/n";
#endif
    */
#if defined DEF_EQUAL_MACRO
    cout<<"DEF_EQUAL_MACRO"<<"/n";
#endif
    system("pause");
    return 0;
}
未命名6

有些软件支持 =,IAR软件编译选项中加入LCD_SUPPORTED=DEBUG:
`VL5FE9WU4Z_])QXV43~{7O

在程序中可以使用判断
#if LCD_SUPPORTED==DEBUG
    #define LCD_SD  // Serial-debug
  #endif

<think>我们正在讨论的是在STM32F103ZET6开发板上点亮LED的程序中,几个#define语句的作用。 用户给出的示例代码中有三个#define#define LED_GPIO_PORT GPIOB #define LED_GPIO_PIN GPIO_Pin_5 #define LED_GPIO_CLK RCC_APB2Periph_GPIOB 这些宏定义的作用是提高代码的可读性、可维护性和可移植性。下面逐一解释: 1. `LED_GPIO_PORT`:定义了LED所连接的GPIO端口,这里是GPIOB。这样在代码中需要使用端口时,就可以使用这个宏,而是直接写GPIOB。如果将来需要更换端口(例如换成GPIOC),只需修改此宏定义,而必在整个代码中搜索替换。 2. `LED_GPIO_PIN`:定义了LED所连接的引脚,这里是GPIO_Pin_5(即5号引脚)。同样,这样定义后,在代码中操作引脚时使用宏,便于修改。 3. `LED_GPIO_CLK`:定义了控制LED所在GPIO端口的时钟,这里是RCC_APB2Periph_GPIOB。在STM32中,每个外设(包括GPIO)都需要使能相应的时钟才能工作。这个宏定义指定了使能哪个时钟。同样,如果端口改变,这里也只需修改宏定义。 使用宏定义的好处: - 程序可读性:看到宏名就知道其代表的含义,比直接使用寄存器或常量更直观。 - 程序可维护性:如果需要改变LED连接的端口或引脚,只需修改宏定义,必修改函数内的代码。 - 程序可移植性:如果同一个程序需要在同的硬件平台上运行(比如另一种开发板LED接在同端口),通过修改宏定义即可适配,而必重写代码。 在示例代码中,这些宏被用在配置函数和主函数中: - 在`LED_GPIO_Config`函数中,使用`LED_GPIO_CLK`来使能端口时钟。 - 配置GPIO初始化结构体时,使用`LED_GPIO_PIN`和`LED_GPIO_PORT`。 - 在主函数中,使用`LED_GPIO_PORT`和`LED_GPIO_PIN`来控制引脚电平。 因此,这些宏定义是编程中常用的技巧,尤其在嵌入式开发中,硬件相关部分常用宏定义来抽象,以降低耦合度。 下面按照用户要求,生成相关问题: 1. 为什么在操作GPIO前需要使能对应的时钟? 2. 如果我想改变LED的引脚,比如改成PC13,代码需要如何修改? 3. 除了使用宏定义,还有其他方法可以管理硬件配置以提高代码可移植性吗? </think>在STM32F103ZET6开发板点亮LED的程序中,`#define`预处理指令主要有三大作用: ### 1. **硬件抽象与可移植性** ```c #define LED_GPIO_PORT GPIOB ``` - 将物理端口`GPIOB`抽象为语义化名称`LED_GPIO_PORT` - 当硬件连接变更(如LED改接到GPIOC)时,只需修改此处定义,无需全局搜索替换[^1] - 提高代码在同硬件平台的可移植性 ### 2. **引脚配置标准化** ```c #define LED_GPIO_PIN GPIO_Pin_5 ``` - 明确定义物理引脚号(PB5),避免魔术数字(magic number) - 统一管理引脚配置,例如: ```c // 初始化代码中直接引用宏 GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN; // 等价于GPIO_Pin_5 ``` ### 3. **时钟资源管理** ```c #define LED_GPIO_CLK RCC_APB2Periph_GPIOB ``` - 封装时钟使能命令,明确指定外设时钟源 - 使时钟配置与业务逻辑解耦: ```c // 使能时钟时直接使用宏 RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE); ``` ### 对比直接编码的差异 | 方案 | 可读性 | 可维护性 | 移植性 | |--------------------|--------|----------|--------| | 使用`#define`宏定义 | ★★★ | ★★★ | ★★★ | | 直接写硬件地址 | ★ | ★ | ✘ | > 例如直接操作寄存器代码:`*(uint32_t*)0x40010C0C &= ~(1<<5);` > 这类代码难以阅读且极易出错,而宏定义提供了硬件操作的抽象层[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值