HAL库中的#ifdef __cplusplusextern “C“ {}

HAL的头文件中有很多的#ifdef __cplusplus的代码,记录一下用途。

#ifdef 是C/C++预处理指令,其作用是用于判断一个宏是否已经被定义。语法如下:

#ifdef macro_name1
    // 代码块 A,如果 macro_name1 宏已经定义,则执行这里的代码
#else
    // 代码块 B,如果 macro_name1 宏未定义,则执行这里的代码
#endif


/*-------------------------------------------------------------*/

#ifdef macro_name2
    // 代码块 C,如果 macro_name2 宏已经定义,则执行这里的代码
#endif

解释一下各部分的含义:

  • #ifdef macro_name:检查 macro_name 宏是否已经定义。如果宏已定义,则执行代码块 A 中的代码;如果未定义,则跳过代码块 A。
  • // 代码块 A:如果 macro_name 宏已经定义,会执行这里的代码。
  • #else:如果 macro_name 宏未定义,则执行代码块 B 中的代码。
  • // 代码块 B:如果 macro_name 宏未定义,会执行这里的代码。
  • #endif:结束 #ifdef 的判断块。

#ifdef #else很像C的if else。两者的主要区别是,预处理器不识别用于标记块的花括号({}),因此它使用#else(如果需要)和#endif(必须存在)来标记指令块。这些指令结构可以嵌套,也可以用这些指令标记C语句块。

HAL的头文件内容如下:

#ifndef __AIR001xx_HAL_RCC_H
#define __AIR001xx_HAL_RCC_H

#ifdef __cplusplus
extern "C" {
#endif

/*代码块*/

#ifdef __cplusplus
}
#endif

#endif
  1. #ifdef __cplusplus#endif: 这是条件预处理指令,用于检查是否正在使用 C++ 编译器。#ifdef 表示 "if defined",即如果已定义宏 __cplusplus,则执行后续的代码。

  2. extern "C" { ... }: 这是C++的语法,用于告诉C++编译器在大括号内的代码块中使用C语言的命名和语法。C++有一些不同于C语言的命名和语法规则,但有时需要与C代码进行交互。使用 extern "C" 可以确保在这个代码块内的函数和变量的命名遵循C语言的规则,以便与C代码进行正确的链接和交互。这种做法非常常见,特别是在涉及到 C 和 C++ 代码混合使用的情况下。通过使用 extern "C" 块,你可以确保在 C++ 环境下正确处理与 C 语言的接口和链接。在这个块内,一般会放置一些 C 语言的函数声明、变量声明或其他与 C 语言兼容的代码。

如果 __cplusplus 宏已经定义,表示当前代码在 C++ 编译环境中。此时,extern "C" 块内的代码会被包装在 extern "C" { ... } 中,以确保这部分代码按照 C 语言的规则进行编译和链接。

如果 __cplusplus 宏未定义,表示当前代码不在 C++ 编译环境中,可能在 C 编译环境中。此时,extern "C" {}会被忽略,不会产生影响。

 

综合起来,这几句预处理指令的作用是:在头文件被多次包含时,确保头文件只被包含一次,并根据当前编译环境是C还是C++,采取适当的语言特性以确保代码的正确性和兼容性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值