2012-05-22 10 views
39

Widziałem kilka informacji na temat różnic między rzeczami takimi jak iostream vs iostream.h. Z tego, co zebraliśmy, wynika, że ​​różnica między nimi polega na tym, że wersja bez rozszerzenia .h nie zapełni przestrzeni nazw, podczas gdy wersja z rozszerzeniem będzie.C++ - cmath vs math.h (I podobne prefiksy c-prefixed vs .h)

Czy to samo dotyczy cmath kontra math.h? Dlaczego cmath (i wiele innych podobnych plików) ma przedrostek c zamiast być tylko math? Czy są między nimi więcej różnic?

Dziękuję za poświęcony czas!

+0

Zobacz również http://stackoverflow.com/q/2118422 i http: // stackoverflow.com/q/2587445 dla pokrewnych (ale może nie dupe) pytań. –

Odpowiedz

22

Widziałem kilka informacji na temat różnic pomiędzy rzeczy jak iostream vs iostream.

[iostream.h] nie jest standardowym nagłówkiem.

nie jest to przykład zgłaszanego problemu.

[cmath] definiuje symbole w przestrzeni nazw std i może również definiować symbole w globalnym obszarze nazw. [math.h] definiuje symbole w globalnej przestrzeni nazw i może również definiować symbole w przestrzeni nazw std. jeśli umieścisz ten pierwszy i użyjesz niewykwalifikowanego symbolu, może on kompilować się z jednym kompilatorem, ale nie z innym. dlatego dobrym pomysłem jest użycie [math.h]. i ogólnie, dla takich par nagłówków, aby użyć wersji [.h].

C++ 98 pod warunkiem formalnej gwarancji nagłówka c xxx nie zanieczyszczających globalnej przestrzeni nazw. może dlatego zostały zdefiniowane. było to jednak nieco trudniejsze do wdrożenia niż te zanieczyszczające, więc w praktyce żadna standardowa implementacja bibliotek, o której się nie znałem, podążała za standardem w tym zakresie, a więc ostatecznie zmieniono ją tak, by odzwierciedlała rzeczywistość w języku C++ 11.

+8

"Dlatego warto używać [math.h]. i ogólnie, dla takich par nagłówków, aby użyć wersji [.h]. Nie zgodziłbym się. Jedynym powodem istnienia wersji .h jest zgodność. Nagłówki C są wymienione pod [** depr **. C.headers] z jakiegoś powodu. –

+12

@Jesse: argument mówi, że jeśli umieścisz 'math.h', to wiesz *, że upuszczasz kupę śmieci w globalnej przestrzeni nazw. Jeśli umieścisz 'cmath', to możesz * lub nie * upuszczać stos śmieci w globalnej przestrzeni nazw. I odwrotnie, nie przejmujesz się tym, czy upuszczasz kupę śmieci w namepace 'std', ponieważ i tak nie definiujesz tam samych symboli. Tak więc niepewność co do tego, czym jest 'matath.h' jest w pewnym sensie lepsza niż niepewność co do' cmath', niezależnie od tego, co komitet o tym myśli. –

+0

@Alf: czy nawet EDG popełnił błąd w C++ 03? O wstyd. –

1

Nagłówki, których nazwy zaczynają się od c, pochodzą z nagłówków biblioteki standardowej C. Odpowiednie nagłówki z prefiksem c zostały usunięte, a dodany przyrostek .h jest identyczny (lub prawie prawie identyczny) ze standardowymi nagłówkami biblioteki C.

<cmath> definiuje odpowiednie symbole w przestrzeni nazw std; <math.h> definiuje je globalnie.

(Właśnie dowiedziałem się, że nie dość, że proste;. Patrz odpowiedź Alf za)

+3

-1 nie, nagłówki rozpoczynające się od 'c' to specyficzne dla C++ warianty nagłówków biblioteki standardowej C. nie pochodzą z biblioteki C. nie ma też gwarancji, że 'cmath' nie definiuje symboli w globalnej przestrzeni nazw i nie ma gwarancji, że' math.h' nie definiuje symboli w przestrzeni nazw 'std'. –

+1

@ Cheersandhth.-Alf: Słabe sformułowanie z mojej strony; Nie miałem na myśli "ze standardowej biblioteki C" sugerującej, że są * bezpośrednio * ze standardowej biblioteki C. Nie wiedziałem, że '' może definiować globalne symbole i '' może definiować symbole w przestrzeni nazw 'std'. Teraz, gdy wiem, jestem zdezorientowany; dlaczego standard C++ pozostawia to zdefiniowane przez implementację? –

+0

@ KeeThompson: ponieważ odzwierciedla rzeczywistość. Wiele standardowych implementacji bibliotek zrobiło to przez tak długi czas. Zamiast wymuszać bardziej restrykcyjne wdrażanie tego problemu (doświadczenie pokazuje, że nie wyszło tak dobrze, jak mogłoby być), standardowa komisja zrezygnowała z oczekiwań programistów. –

0

Może to będzie pomocne:

C++ biblioteka zawiera te same definicje jak biblioteki języka C zorganizowanej w tej samej strukturze plików nagłówkowych, z następującymi różnicami: Każdy plik nagłówka ma takie same nazwa jako wersja językowa C , ale z prefiksem "c" i bez rozszerzenia. Na przykład: odpowiednik C++ dla pliku nagłówkowego języka C to . Każdy element biblioteki jest zdefiniowany w przestrzeni nazw std .

c-prefixed vs .h extension headers