2015-11-04 60 views
18

Często napotykam pliki nagłówkowe C zawierające extern "C",
, ale nie zawierają żadnych rzeczywistych funkcji. Na przykład:Czy istnieje jakikolwiek powód używania zewnętrznego "C" w nagłówkach bez metod?

/* 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 */ 

wiem, że extern "C" zapobiega nazwa przekręcona o funkcjach, ale to również zapobiec przed innymi interfejsu komunikacyjnego zagadnień dotyczących deklaracji zmiennych i typu?

Czy użycie powyższego przykładu extern "C" jest pozbawione znaczenia pod względem zgodności?

+1

'extern" C "' nie "zapobiega" wymieszaniu nazw. Informuje kompilator, między innymi, o używaniu manglingu w stylu C. –

Odpowiedz

23

Niektóre kompilatory (to rzadkie) implementują wymazywanie nazw również dla zmiennych, nie tylko dla funkcji. W takim przypadku może być potrzebne extern "C".

Niektóre kompilatory (to także rzadkie, ale wymagane przez normę) wdrożyć język powiązania dla funkcji typy, nie tylko nazwy, więc typedef void f(); i extern "C" { typedef void f(); } deklarują różne typy.

Ponadto niektórzy opiekunowie nie zauważą braku extern "C", jeśli zmodyfikują nagłówek w celu dodania funkcji.

Polecam po prostu to załączyć.

+0

Czy jesteś pewien, że takie połączenie jest * wymagane * w standardzie? Jeśli tak, dlaczego jest tak rzadki? – Quentin

+1

@Quentin Tak, jestem pewien. Jednak użytkownicy mają bardzo małe zapotrzebowanie na tę funkcję, więc implementacje koncentrują się na innych funkcjach, które mają większe zapotrzebowanie. – hvd

+0

Dziękujemy za potwierdzenie, że "wymagane przez standard" nie oznacza "zawsze dostępne/zaimplementowane". –

9

Nie, extern C nie jest tam potrzebny, ale może być wygodnie mieć go we wszystkich nagłówkach, aby upewnić się, że nie zostanie zapomniany po dodaniu nowej funkcji.