Почему volatile не является частью sig_atomic_t - PullRequest
4 голосов
/ 15 июня 2019

На моей платформе (X86, Fedora, gcc 9.1.1) sig_atomic_t является typedef'd для простого int.

В стандарте C ++ sig_atomic_t всегда используется с квалификатором volatile.
Я понимаю, почему необходим volatile, но почему тогда он не является частью типа?

Что-то вроде:

using sig_atomic_t = volatile int;

Ответы [ 2 ]

4 голосов
/ 15 июня 2019

Это унаследовано от C. Определение C, хотя допускает, что sig_atomic_t является волатильно квалифицированным, не требует его. Все примеры использования в стандартном документе, на который я смотрел (N1570), даны как volatile sig_atomic_t.

В наши дни может быть лучше использовать std:atomic и другие возможности, указанные в заголовке <atomic> , когда это возможно . (Также см. sig_atomic_t на cppreference.)

3 голосов
/ 15 июня 2019

C89 говорит, что это

интегральный тип объекта, к которому можно обращаться как к атомарному сущность, даже при наличии асинхронных прерываний.

volatile не указано, возможно, потому что классификаторы были новой вещью, когда был разработан первый стандарт.

C99 добавляет «возможно, квалифицированный как волатильный.

Я полагаю, что это обратная совместимость с тех пор, в сочетании с "никого не волнует достаточно", поскольку обработка сигналов является относительно незначительной частью большинства проектов.

Также кто-то может предположительно использовать его в контексте, где volatile не требуется (например, для хранения копии флага, используемого для связи с обработчиками сигналов), а в не-GNU C (опять же, с обратной совместимостью) в принципе невозможно сопоставить тип с менее квалифицированной версией этого типа, что делает реализацию, которая выбирает опускать квалификатор, более гибкой.

...