在没有方法的头文件中使用extern "C"是否有任何理由?

18

我经常遇到包含 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"是否无意义,与结果的兼容性无关?


1
extern "C"并不会"防止"名称混淆。它告诉编译器,除其他事项外,使用C风格的名称混淆。 - Pete Becker
2个回答

23

一些编译器(这很少见)对变量也实现了名称重整,而不仅仅是函数。在这种情况下,可能需要使用extern "C"

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

此外,如果维护者修改头文件以添加函数,则有些人可能不会注意到缺少extern "C"

我建议您只需将其包含在内。


你确定类型链接在标准中是必需的吗?如果是,为什么它如此罕见? - Quentin
1
@Quentin 是的,我确定。然而,用户对此功能的需求非常少,因此实现更关注其他更受欢迎的功能。 - user743382
感谢您认识到“标准要求”并不意味着“总是可用/实现”。 - Kyle Strand
@Quentin:就我个人而言,我认为函数类型链接是C++的反特性。例如,这使得使用指向C++静态成员的指针作为C函数指针在技术上不可能。C++委员会对qsort()bsearch()进行了一些修改,他们认为问题已经不存在了。 - rodrigo

9

不需要使用 extern C,但是将其添加到所有头文件中可能会更加方便,以确保在添加新函数时不会被遗忘。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接