最近学习了一些头文件的写法,遂记录,如下:
#ifndef __API_CAN_H
#define __API_CAN_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
void my_c_function();
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif
接下来进行拆解。首先是头文件保护宏,对应代码的前两行与最后一行:
#ifndef __API_CAN_H
#define __API_CAN_H
#endif
其作用为:头文件保护。在读取头文件时,预处理器会首先检查是否已经定义了该宏,在没有定义(即:if not define)的情况下才会继续处理头文件的内容。若已被定义,那么预处理器就会跳过头文件中的所有内容(从#ifndef到#endif之间的部分),从而避免了重复定义导致的编译错误。
接下来看这部分代码:
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
其作用为:兼容C++,使得在C++环境下也可以正确地调用C函数。
#ifdef __cplusplus 的作用为检查当前的编译环境。若环境为C++,则该宏为真
#if __cplusplus的作用与上面其实是类似的,作编译环境的检查。作用与上面重复,可以说是冗余的,但看作双重检查也不是不行(?)
若宏为真,说明当前编译环境为C++。C++编译器和C编译器对名称的处理方式不同,因此需要 extern "C" { 来告诉C++编译器随后的函数和变量声明应该以C语言的方式链接。
再看这部分代码:
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
功能和上一部分基本一致,确保“extern”块有一个匹配的结束括号。 这两部分合在一起,就可以在C++代码中安全地包含C代码或C函数声明,并确保它们以C语言的方式链接。