有没有理由在没有方法的标题上使用extern"C"?

Tre*_*key 18 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 */
Run Code Online (Sandbox Code Playgroud)

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

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

小智 23

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

一些编译器(它也是罕见的,但标准所要求的)实现联动语言的函数类型,不只是名字,所以typedef void f();extern "C" { typedef void f(); }声明不同的类型.

此外,一些维护者不会注意到extern "C"他们是否修改标头以添加功能.

我建议你只包括它.


Sta*_*tas 9

不,extern C那里不需要,但是在所有标题中都可以使用它,以确保在添加新功能时不会忘记它.