有没有理由使用extern" C"没有方法的标头?

时间:2015-11-04 16:02:56

标签: c++ c header-files extern extern-c

我经常遇到包含extern "C"警卫的C头文件,
但不包含任何实际功能。例如:

/* b_ptrdiff.h - base type ptrdiff_t definition header */

#ifndef __INCb_ptrdiff_th
#define __INCb_ptrdiff_th

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef long ptrdiff_t;
#endif /* _PTRDIFF_T */

#ifdef __cplusplus
}
#endif

#endif /* __INCb_ptrdiff_th */

我知道extern "C"会阻止对函数进行名称修改,但它是否也可以防止变量和类型声明的其他接口问题?

上述示例中extern "C"的使用在产生的兼容性方面是否毫无意义?

2 个答案:

答案 0 :(得分:23)

有些编译器(很少见)也会为变量实现名称修改,而不仅仅是函数。在这种情况下,可能需要extern "C"

某些编译器(它也很少见,但标准要求)实现了函数类型的语言链接,而不仅仅是名称,因此typedef void f();extern "C" { typedef void f(); }声明了不同的类型。

此外,如果修改标题以添加功能,一些维护者将不会注意到extern "C"的缺席。

我建议你加入它。

答案 1 :(得分:9)

不,那里不需要String,但是在所有标题中都可以方便,以确保在添加新功能时不会忘记它。