2012-12-04 23 views
5

Zazwyczaj jeden zawiera standardowe nagłówki biblioteki w C++ w globalnej przestrzeni nazw, poza jakimkolwiek extern s, tak jak poniżej:Jakie jest określone zachowanie włączenia standardowego nagłówka C, w kodzie C++, wewnątrz specyfikacji powiązań (zewnętrzne "C", zewnętrzne "C++")?

#include <stdint.h> 

int main() { } 

ale co określono wydarzy, jeśli zawierają standardowy nagłówek biblioteki wewnątrz jednego? Na przykład:

extern "C" { 
#include <stdint.h> 
} 
int main() { } 

lub

extern "C++" { 
#include <stdint.h> 
} 
int main() { } 

Czy jest określony, co powinno się zdarzyć w każdym przypadku, czy jest to wdrożenie zdefiniowane lub nawet niezdefiniowane?

C++ 11 17.6.2.3p1 mówi, że standardowe nagłówki biblioteki C++ umieszczają rzeczy w extern "C++", ale moje wstępne czytanie jest takie, że nie dotyczy to nagłówków C, takich jak <stdint.h>. C++ 11 17.6.2.2p3 mówi, że nagłówki mogą być tylko poza zewnętrzną dowolną "zewnętrzną deklaracją"; ta fraza pojawia się tylko w tym jednym miejscu w C++ 11, więc nie jestem pewien, czy może się tu znaleźć. (Zakładam, że C99 nie ma nic do powiedzenia na ten temat.)

(Dla mojego konkretnego przypadku nie jest to opcja użycia standardowych nagłówków C++ o <c*>, więc naprawdę muszę znać semantykę tylko dla starej szkoły C nagłówków.)

+3

na jakiej złamanej implementacji nie można użyć nagłówków C++ ''? I dlaczego podążanie za standardem w tak zepsutej implementacji byłoby w ogóle istotne? – rubenvb

+0

@rubenvb Rozwijanie w osadzonym/jądrze często stwarzało podobne ograniczenia, zarówno pod względem technicznym, jak i wyboru. – SomeWittyUsername

+0

@icepack Pewne, wolnostojące implementacje nie muszą zawierać wszystkich części standardowej biblioteki, ale jeśli można podać '* .h' tak samo może odpowiadać odpowiedni nagłówek 'c *'. Dlaczego każda implementacja zdecyduje się nie mieć obu? – bames53

Odpowiedz

5

Standard nie mówi nic o nagłówkach C, które nie są częścią C++. Poprzedni do C++ - 11, stdint.h/cstdint nie był częścią C++. To zależy od tego nagłówka, jak zachowuje się po dołączeniu go do kodu C++.

Jeśli pytasz o nagłówkach C, które część C++, jedyną różnicą między *.h i c* jest, że pierwsze nie jest wymagane, aby dodać swoje identyfikatory do nazw std (jest to opcja, czy robi to tak lub nie), podczas gdy drugi jest wymagany do wykonania tej operacji (i może opcjonalnie dodać je do globalnej przestrzeni nazw). Nie ma żadnej innej różnicy. Nie powinieneś umieszczać standardowego nagłówka *.h wewnątrz bloku extern "C", ponieważ same nagłówki w razie potrzeby zajmują się łączeniem C.

Jeśli masz niestandardowe nagłówki C, które chcesz uwzględnić z kodu C++, musisz sprawdzić te nagłówki, aby określić, czy musisz je uwzględnić extern "C", czy też nie, w każdym przypadku.

+0

Nagłówki '* .h' są wymagane tylko do dodania nazw do globalnego obszaru nazw, ale mogą również dodać je do przestrzeni nazw' std'. Nagłówki 'c *' są wymagane tylko do dodania nazw do przestrzeni nazw 'std', ale mogą również dodać je do globalnej przestrzeni nazw. – bames53

+0

@ bames53 Dzięki. Naprawiony. –