我知道带有#ifdef的C头文件的声明以及变量和函数之前的extern的含义。但最近我有一个嵌入式设备的第三方库,具有以下方案:
/* "lib.h" */
#ifndef LIB_H_
#define LIB_H_
#ifdef LIB_C
void function1();
/* ... */
#else
extern void function1();
/* ... */
#endif
#endif /* LIB_H_ */
另外我有一个相应的C源文件:
/* lib.c */
#define LIB_C
#include "lib.h"
void function1()
{
/* ... */
}
/* ... */
所以我在这里有点困惑。以这种方式在标题中声明所有函数两次的原因是什么?
答案 0 :(得分:4)
对于某些不符合要求或古老的编译器而言,它是一种矫揉造作或兼容性攻击。您不需要extern
版本,但使用它也没关系,因为默认情况下函数声明是extern。
换句话说,它是残酷的,但也许有人需要那种残酷。我们无法确定。