2016-11-09 212 views
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() 
    { 
    /* ... */ 
    } 

/* ... */ 

所以我在这里和有点困惑。以这种方式在标题中两次声明所有函数的原因是什么?

+0

嗯..这很有趣.... IIRC,默认情况下功能是外部连接。 –

+2

[C与C++中的外部函数]可能的重复(http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick

+1

一般来说,这样的代码是危险的。这意味着在两部分的某个地方,“图书馆内部”和“图书馆外部”的某些功能之间可能存在显着差异(不仅仅存在或不存在“外部”)。这是一个问题,因为“内部”代码使用与“外部”代码使用相同的定义确保两者是同步的 - 所以如果存在差异,则可能存在编译器无法诊断的问题。请注意,该声明不是原型;它只是一个带有未指定参数列表的函数(但不包含省略号)。 –

回答

4

它可能是一种虚构,或者是对某些不合格或古代编译器的兼容性破解。你不需要extern版本,但使用它也很好,因为函数声明默认是extern。

换句话说,它是残酷的,但也许有人需要那个残酷。我们无法确定。