STM32(一):新建工程

  • stm32f10x.h文件:描述stm32有哪些寄存器(外围)和它对应的地址。
  • stm32由内核和内核外围的设备组成的,内核寄存器描述和外围寄存器描述文件存储位置不在一起
  • core_cm3.h core_cm3.c内核寄存器描述文件。
  • mic.c内核库函数 stm32f10x_conf.h用来配置头文件的包含关系和参数检查的函数定义,stm32f10x_it.c存放中断函数。
  • 启动函数的选择(选择后缀)
  • 新建工程步骤

 

疑问:头文件中这种结构有什么用?

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);    
#endif

通过一些简单的例子来说明“包含”(Include)和“重复包含”(Repeated Inclusion)的概念。

包含(Include)

包含是指在一个源文件中通过预处理指令#include来插入另一个文件(通常是头文件)的内容。这样做的主要目的是为了代码的重用和模块化。

例子

假设你有一个头文件math_functions.h,里面定义了一些数学函数的声明:

// math_functions.h  
#ifndef MATH_FUNCTIONS_H  
#define MATH_FUNCTIONS_H  
  
// 函数声明  
int add(int a, int b);  
int subtract(int a, int b);  
  
#endif // MATH_FUNCTIONS_H

然后,在你的源文件main.c中,你想要使用这些数学函数,于是你包含了math_functions.h头文件:

// main.c  
#include <stdio.h>  
#include "math_functions.h" // 包含math_functions.h头文件  
  
int main() {  
    int result = add(5, 3);  
    printf("5 + 3 = %d\n", result);  
    return 0;  
}

在这个例子中,#include "math_functions.h"指令告诉预处理器将math_functions.h文件的内容插入到main.c#include指令的位置。这样,main.c就可以知道add函数的声明,从而能够调用它。

重复包含(Repeated Inclusion)

重复包含是指同一个头文件在同一个编译单元(比如一个源文件)中被包含多次。这通常会导致编译错误或未定义行为,因为头文件中的某些内容(如全局变量定义、函数体定义、重复的宏定义等)不应该被多次包含。

例子(未使用包含保护的情况):

假设math_functions.h没有使用包含保护(即没有#ifndef#define#endif):

// math_functions.h(无包含保护)  
int add(int a, int b);  
int subtract(int a, int b);  
  
// 假设这里还有一个全局变量定义(实际上在头文件中定义全局变量是不好的做法)  
int global_var = 0; // 警告:这会导致问题!

然后,在main.c中,由于某种原因(可能是间接包含),math_functions.h被包含了两次:

// main.c(假设math_functions.h被包含了两次)  
#include "math_functions.h"  
// ... 可能还有其他代码,包括另一个也包含了math_functions.h的头文件  
#include "math_functions.h" // 重复包含  
  
int main() {  
    // ...  
}

在这个例子中,由于math_functions.h没有包含保护,global_var会被定义两次,这会导致编译错误(通常是“重复定义”的错误)。

使用包含保护解决重复包含

通过添加包含保护到math_functions.h,我们可以防止这种情况:

// math_functions.h(使用包含保护)  
#ifndef MATH_FUNCTIONS_H  
#define MATH_FUNCTIONS_H  
  
int add(int a, int b);  
int subtract(int a, int b);  
  
// 假设全局变量已经被移除或改为其他形式(如extern声明)  
  
#endif // MATH_FUNCTIONS_H

现在,即使math_functions.h被包含多次,它的内容也只会在第一次包含时被插入,后续的包含会被预处理器的#ifndef检查所阻止。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值