2015-11-04 61 views
18

我經常遇到C頭文件,其中包含extern "C"後衛,
但不包含任何實際功能。例如:是否有任何理由在沒有方法的頭文件中使用extern「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風格的名稱修改。 –

回答

23

一些編譯器(很少見)也爲變量實現名稱修改,而不僅僅是函數。在這種情況下,可能需要extern "C"

一些編譯器(它也是罕見的,但標準所要求的)實現聯動語言爲功能類型,不只是名字,所以typedef void f();extern "C" { typedef void f(); }聲明不同的類型。

此外,如果某些維護人員修改頭添加函數,則不會注意到缺少extern "C"

我建議你只包括它。

+0

您確定該類型鏈接是*標準所要求的*嗎?如果是這樣,爲什麼這麼罕見? – Quentin

+1

@Quentin是的,我確定。但是,用戶對此功能的需求非常少,因此實現側重於其他需求較高的功能。 – hvd

+0

感謝您承認「標準要求」並不意味着「始終可用/已實施」。 –

9

不,extern C在那裏是不需要的,但是在所有的頭文件中可能會很方便,以確保在添加新函數時不會忘記它。

相關問題