我经常遇到包含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"
的使用在产生的兼容性方面是否毫无意义?
答案 0 :(得分:23)
有些编译器(很少见)也会为变量实现名称修改,而不仅仅是函数。在这种情况下,可能需要extern "C"
。
某些编译器(它也很少见,但标准要求)实现了函数类型的语言链接,而不仅仅是名称,因此typedef void f();
和extern "C" { typedef void f(); }
声明了不同的类型。
此外,如果修改标题以添加功能,一些维护者将不会注意到extern "C"
的缺席。
我建议你加入它。
答案 1 :(得分:9)
不,那里不需要String
,但是在所有标题中都可以方便,以确保在添加新功能时不会忘记它。