2012-05-22 7 views
39

Ho visto alcune informazioni sulle differenze tra cose come iostream vs iostream.h. Da quello che ho raccolto da quelli la differenza tra loro è che la versione senza l'estensione .h non popolerà lo spazio dei nomi mentre la versione con l'estensione lo farà.C++ - cmath vs math.h (E intestazioni di estensione con prefisso c-prefisso vs .h)

È lo stesso per cmath vs math.h? Perché lo cmath (e molti altri file simili) ha come prefisso uno c invece di essere semplicemente math? Ci sono più differenze tra loro?

Grazie per il vostro tempo!

+0

Vedi anche http://stackoverflow.com/q/2118422 e http: // StackOverflow.it/q/2587445 per domande correlate (ma forse non dupe). –

risposta

22

Ho visto alcune informazioni sulle differenze tra le cose come iostream vs iostream.h.

[iostream.h] non è un'intestazione standard.

non è un esempio del problema che stai sollevando.

[cmath] definisce i simboli nello spazio dei nomi std e può anche definire i simboli nello spazio dei nomi globale. [math.h] definisce i simboli nello spazio dei nomi globale e può anche definire i simboli nello spazio dei nomi std. se includi il primo e usi un simbolo non qualificato, esso può essere compilato con un compilatore ma non con un altro. quindi è una buona idea usare [math.h]. e in generale, per tali coppie di intestazione, usare la versione [.h].

C++ 98 ha fornito una garanzia formale dell'intestazione c xxx che non inquina lo spazio dei nomi globale. forse era per quello che erano stati definiti. tuttavia, quello era un po 'più difficile da implementare rispetto a quelli inquinanti, quindi in pratica nessuna implementazione di libreria standard che io conosca ha seguito lo standard in questo senso, e quindi è stato finalmente modificato per riflettere la realtà in C++ 11.

+8

'quindi è una buona idea usare [math.h]. e in generale, per tali coppie di intestazione, usare la versione [.h]. Non sarei d'accordo. L'unica ragione per cui esistono le versioni .h è per la compatibilità. Le intestazioni C sono elencate sotto [** depr **. C.headers] per un motivo. –

+12

@Jesse: l'argomento dice che se includi 'math.h', allora * sai * stai facendo cadere un ammasso di spazzatura nel tuo spazio dei nomi globale. Se includi 'cmath', * potresti * o non potresti * lasciare cadere un ammasso di spazzatura nel tuo spazio dei nomi globale. Viceversa, non ti importa se lasci cadere un mucchio di cianfrusaglie nel namepace 'std', dal momento che non hai mai definito i simboli lì dentro comunque. Quindi l'incertezza su ciò che 'math.h' fa è in un certo senso migliore dell'incertezza su cosa' cmath', indipendentemente da ciò che la commissione pensa a riguardo. –

+0

@ Alf: l'EDG ha sbagliato quello in C++ 03? Per vergogna. –

1

Le intestazioni i cui nomi iniziano con c derivano dalle intestazioni della libreria standard C. Le intestazioni corrispondenti con il prefisso c rimosso e un suffisso .h aggiunto sono identiche (o quasi identiche) alle intestazioni di libreria standard C.

<cmath> definisce i simboli rilevanti sotto lo spazio dei nomi std; <math.h> li definisce globalmente.

(Ho appena appreso che non è così semplice;. Vedi risposta di Alf)

+3

-1 no, le intestazioni che iniziano con 'c' sono varianti specifiche di C++ delle intestazioni di libreria standard C. non provengono dalla libreria C. inoltre, non vi è alcuna garanzia che 'cmath' non definisca i simboli nello spazio dei nomi globale, e non c'è alcuna garanzia che' math.h' non definisca i simboli nello spazio dei nomi 'std'. –

+1

@ Cheersandhth.-Alf: testo sciatto da parte mia; Non intendevo "dalla libreria standard C" per implicare che sono * direttamente * dalla libreria standard C. Non sapevo che '' potesse definire i simboli globali e '' potrebbe definire i simboli nello spazio dei nomi 'std'. Ora che lo so, sono confuso; perché lo standard C++ lascia definito quell'implementazione? –

+0

@KeithThompson: perché riflette la realtà. Un sacco di implementazioni di libreria standard lo hanno fatto per così tanto tempo. Invece di forzare le implementazioni a essere più rigide su questo argomento (l'esperienza dimostra che questo non ha funzionato abbastanza bene come avrebbe potuto), il comitato standard ha allentato le aspettative dei programmatori. –

0

Forse questo sarebbe utile:

libreria Il C++ include le stesse definizioni come la libreria in linguaggio C organizzata nella stessa struttura di file di intestazione, con le seguenti differenze: Ogni file di intestazione ha lo stesso nome come versione di lingua C ma con un prefisso "c" e nessuna estensione. Ad esempio, l'equivalente C++ per il file di intestazione del linguaggio C è . Ogni elemento della libreria è definito all'interno dello spazio dei nomi std .

c-prefixed vs .h extension headers