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.)
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
@rubenvb Rozwijanie w osadzonym/jądrze często stwarzało podobne ograniczenia, zarówno pod względem technicznym, jak i wyboru. – SomeWittyUsername
@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