2013-06-19 16 views
7

qualcuno può chiarire la differenza tra le opzioni di inclusione #include <atomic> e #inlucde <cstdatomic>?Qual è la differenza tra "atomico" e "cstdatomic"?

Immagino che non ci sia nessuno, perché è lo stesso comportamento?

Lo chiedo perché sul mio sistema Debian ho solo l'atomico e sul mio sistema kubuntu ho il cstdatomic.

  • compilatore su Debian: la versione 4.7.2 (Debian 4.7.2-4)

  • compilatore su Kubuntu: la versione 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

+0

Bene, qual è la differenza tra 'cstdio' e' iostream'? Ovviamente è più o meno la stessa funzionalità, ma uno è C++ corretto e l'altro è C legacy. –

risposta

8

<atomic> è la libreria di operazioni atomiche C++.

<cstdatomic> è la versione C++ della libreria delle operazioni atomiche C.

Entrambi vi daranno, ad esempio, std::atomic_char ma solo la versione C++ ha std::atomic<T>.

Come regola generale, le intestazioni C deve essere usato in C++, eliminando l'estensione .h e anteponendo c al nome: stdatomic.h diventa cstdatomic. Ciò includerà le intestazioni C nello spazio dei nomi std.

Nota anche che stdatomic.h (e cstdatomic quindi) è C11 e atomic è C++ 11, che potrebbe spiegare la differenza nel supporto del compilatore.

+0

grazie per la spiegazione. – baam

+2

@baam "Regola generale inversa": un'intestazione C++ che assomiglia a '' è probabilmente l'equivalente C++ di un'intestazione C ''. : p –

+3

'stdatomic.h' viene da C11, non C99. Gli Atomics sono stati sviluppati congiuntamente dai comitati di standard C e C++ per gli standard del 2011. –

15

Entrambe le risposte esistenti sono errate e la maggior parte dei commenti.

<cstdatomic> non è un'intestazione definita in standard.

È stato definito in vecchie bozze C++ 0x ma non è nello standard C++ 11 finale, solo <atomic>. Quindi è stato incluso come parte del supporto sperimentale C++ 0x di GCC 4.4, ma poi è stato rinominato per le versioni successive quando è stato rinominato nelle bozze di C++ 0x (che è stato fatto nel 2009 con N2992).

Non si dovrebbe usare <cstdatomic> a meno che non si è bloccati con GCC 4.4 e felice di utilizzare una versione incompleta e buggy di atomici C++ 11. (Non ho idea del perché GCC 4.6 di Kubuntu includa l'intestazione, non è nelle versioni GCC 4.6 upstream, deve essere una patch Ubuntu o Kubuntu o Linaro.)

<atomic> è l'intestazione standard C++ 11 che può fare affidamento su qualsiasi implementazione C++ 11 che risponda ragionevolmente.

<stdatomic.h> è l'intestazione C11, ma la libreria C++ 11 si basa sulla libreria C99, quindi non include <stdatomic.h> e non fornisce uno <cstdatomic> corrispondente.

+1

Riferimento di supporto: https://gcc.gnu.org/gcc-4.5/changes.html - la vecchia intestazione è stata spostata sul nuovo nome in libstdC++ fornito con GCC 4.5 – Novelocrat

Problemi correlati