3
我知道在#变量和函数之前用#ifdef和extern的含义来声明C头文件。但最近我有一个第三方库使用以下方案的嵌入式设备:函数在C头文件中声明了两次
/* "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()
{
/* ... */
}
/* ... */
所以我在这里和有点困惑。以这种方式在标题中两次声明所有函数的原因是什么?
嗯..这很有趣.... IIRC,默认情况下功能是外部连接。 –
[C与C++中的外部函数]可能的重复(http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick
一般来说,这样的代码是危险的。这意味着在两部分的某个地方,“图书馆内部”和“图书馆外部”的某些功能之间可能存在显着差异(不仅仅存在或不存在“外部”)。这是一个问题,因为“内部”代码使用与“外部”代码使用相同的定义确保两者是同步的 - 所以如果存在差异,则可能存在编译器无法诊断的问题。请注意,该声明不是原型;它只是一个带有未指定参数列表的函数(但不包含省略号)。 –