2013-06-19 2 views
7

может кто-то прояснить разницу между включенными опциями #include <atomic> и #inlucde <cstdatomic>?В чем разница между «атомарным» и «cstdatomic»?

Я предполагаю, что их нет, потому что это одно и то же поведение?

Я спрашиваю об этом, потому что на моей системе debian у меня есть только атомный, а на моей системе kubuntu у меня есть cstdatomic.

  • компилятор на Debian: версия 4.7.2 (Debian 4.7.2-4)

  • компилятор на Kubuntu: версия 4.6.3 (Ubuntu/Линаро 4.6.3-1ubuntu5)

+0

В чем разница между 'cstdio' и' iostream'? Конечно, это более или менее та же функциональность, но одна из них - C++, а другая - C. –

ответ

8

<atomic> - это атомная операционная библиотека C++.

<cstdatomic> - это C++-версия библиотеки операций с атомами C.

Оба передадут вам, например, std::atomic_char, но только версия C++ имеет номер std::atomic<T>.

Как правило, заголовки C следует использовать в C++, удалив расширение .h и предваряя c имени: stdatomic.h становится cstdatomic. Это будет включать заголовки C в пространство имен std.

Обратите также внимание на то, что stdatomic.hcstdatomic) является C11 и atomic является C++ 11, что может объяснить разницу в поддержке компилятора.

+0

спасибо за объяснение. – baam

+2

@baam «Обратное общее правило»: заголовок C++, который выглядит как '', вероятно, является эквивалентом C++ заголовка C ''. : p –

+3

'stdatomic.h' происходит от C11, а не C99. Atomics были разработаны совместно комитетами стандартов C и C++ для стандартов 2011 года. –

15

Оба существующих ответа неверны и большинство комментариев тоже.

<cstdatomic> не является заголовком, определенным в любым стандартом.

Он был определен в старых черновиках C++ 0x, но не в последнем стандарте C++ 11, только <atomic>. Поэтому он был включен как часть экспериментальной поддержки C++ 0x GCC 4.4, но затем переименован для последующих выпусков, когда он был переименован в черновики C++ 0x (что было сделано в 2009 году N2992).

Вам не следует использовать <cstdatomic>, если вы не застряли в GCC 4.4 и не можете использовать неполную и глючную версию атома C++ 11. (Я понятия не имею, почему GCC 4.6 Kubuntu включает заголовок, он не находится в восходящих версиях GCC 4.6, это должен быть патч Ubuntu или Kubuntu или Linaro.)

<atomic> - стандартный заголовок C++ 11, который вы может полагаться на любую разумно соответствующую реализацию C++ 11.

<stdatomic.h> является заголовком C11, но библиотека C++ 11 основана на библиотеке C99, поэтому не включает <stdatomic.h> и не соответствует соответствующему ей <cstdatomic>.

+1

Поддерживающая ссылка: https://gcc.gnu.org/gcc-4.5/changes.html - старый заголовок был перенесен на новое имя в libstdC++, поставляемом вместе с GCC 4.5 – Novelocrat

Смежные вопросы