Заголовки <csetjmp> (нелокальные переходы), <csignal> (обработки сигнала), <cstdarg> (переменные аргументы), и <cstdlib> (среда окружение getenv, system), обеспечивают дополнительную совместимость с кодом C.
Вызов функции getenv не должен вызывать гонку данных ([res.on.data.races]) при условии, что ничто не изменяет среду. [ Note: Вызывает функции POSIX setenv и putenv изменяет среду. ] — end note
Вызов setlocale функции может привести к гонке данных с другими вызовами setlocale функции или с вызовами функций, на которые влияет текущий языковой стандарт C. Реализация должна вести себя так, как если бы ни одна из библиотечных функций не locale::global вызывала эту setlocale функцию.
namespace std { using va_list = see below; } #define va_arg(V, P) see below #define va_copy(VDST, VSRC) see below #define va_end(V) see below #define va_start(V, P) see below
Содержимое заголовка <cstdarg> такое же, как заголовок стандартной библиотеки C <stdarg.h>, со следующими изменениями: Ограничения, которые ISO C накладывает на второй параметр va_start макроса в заголовке <stdarg.h> , в этом международном стандарте другие. Параметр parmN - это крайний правый параметр в списке переменных параметров определения функции (тот, который находится непосредственно перед ...).219 Если параметр parmN представляет собой расширение пакета ([temp.variadic]) или объект, полученный в результате лямбда-захвата ([expr.prim.lambda]), программа имеет неправильный формат , диагностика не требуется. Если параметр parmN имеет ссылочный тип или тип, несовместимый с типом, который возникает при передаче аргумента, для которого нет параметра, поведение не определено.
См. Также: ISO C 7.16.1.1.
Обратите внимание, что va_start требуется для работы, как указано, даже если унарный operator& перегружен для типа parmN.
namespace std { using jmp_buf = see below; [[noreturn]] void longjmp(jmp_buf env, int val); } #define setjmp(env) see below
В longjmp(jmp_buf jbuf, int val) этом международном стандарте сигнатура функции имеет более ограниченное поведение. setjmp/longjmp Пара вызова имеет неопределенное поведение , если замену setjmp и longjmp путь catch и throw будет вызывать любые нетривиальные деструкторы для любых автоматических объектов.
См. Также: ISO C 7.13.
namespace std { using sig_atomic_t = see below; // [support.signal], signal handlers extern "C" using signal-handler = void(int); // exposition only signal-handler* signal(int sig, signal-handler* func); int raise(int sig); } #define SIG_DFL see below #define SIG_ERR see below #define SIG_IGN see below #define SIGABRT see below #define SIGFPE see below #define SIGILL see below #define SIGINT see below #define SIGSEGV see below #define SIGTERM see below
Вызов функции signal синхронизируется с любым результирующим вызовом установленного таким образом обработчика сигнала.
A plain lock-free atomic operation - это вызов функции f из Clause [atomics], такой что:
f это функция atomic_is_lock_free(), или
f это функция-член is_lock_free(), или
f - нестатическая функция-член, вызываемая для объекта A, такая, что A.is_lock_free() дает true, или
f является функцией не являющегося членом, и для каждого указателя к атомным аргумента A передается f, atomic_is_lock_free(A) выходы true.
Оценка проводится, signal-safe если она не включает одно из следующего:
вызов любой стандартной библиотечной функции, за исключением простых атомарных операций без блокировки и функций, явно определенных как безопасные для сигналов. [ Note: Это неявно исключает использование new и delete выражения , которые полагаются на библиотеку , предоставленный распределителем памяти. ] — end note
доступ к объекту с длительностью хранения потока;
dynamic_cast выражение;
выброс исключения;
контролировать ввод try-blockили function-try-block;
инициализация переменной со статической продолжительностью хранения, требующей динамической инициализации ([basic.start.dynamic], [stmt.dcl])220; или
ожидает завершения инициализации переменной со статической продолжительностью хранения ([stmt.dcl]).
Вызов обработчика сигнала имеет неопределенное поведение, если он включает оценку, небезопасную для сигнала.
Функция signal безопасна для сигналов, если она вызывается с первым аргументом, равным номеру сигнала, соответствующему сигналу, вызвавшему вызов обработчика.
См. Также: ISO C 7.14.
Такая инициализация может произойти, потому что это первая функция odr-use ([basic.def.odr]) этой переменной.