21 Language support library [language.support]

21.10 Other runtime support [support.runtime]

Заголовки <csetjmp> (нелокальные переходы), <csignal> (обработки сигнала), <cstdarg> (переменные аргументы), и <cstdlib> (среда окружение getenv, system), обеспечивают дополнительную совместимость с кодом C.

Вызов функции getenv не должен вызывать гонку данных ([res.on.data.races]) при условии, что ничто не изменяет среду. [ Note: Вызывает функции POSIX setenv и putenv изменяет среду. ] end note

Вызов setlocale функции может привести к гонке данных с другими вызовами setlocale функции или с вызовами функций, на которые влияет текущий языковой стандарт C. Реализация должна вести себя так, как если бы ни одна из библиотечных функций не locale​::​global вызывала эту setlocale функцию.

21.10.1 Header <cstdarg> synopsis [cstdarg.syn]

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.

21.10.2 Header <csetjmp> synopsis [csetjmp.syn]

namespace std {
  using jmp_buf = see below;
  [[noreturn]] void longjmp(jmp_buf env, int val);
}

#define setjmp(env) see below

Содержимое заголовка <csetjmp> такие же , как заголовок стандартной библиотеки C <setjmp.h>.

В longjmp(jmp_­buf jbuf, int val) этом международном стандарте сигнатура функции имеет более ограниченное поведение. setjmp/longjmp Пара вызова имеет неопределенное поведение , если замену setjmp и longjmp путь catch и throw будет вызывать любые нетривиальные деструкторы для любых автоматических объектов.

См. Также: ISO C 7.13.

21.10.3 Header <csignal> synopsis [csignal.syn]

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

Содержимое заголовка <csignal> такие же , как заголовок стандартной библиотеки C <signal.h>.

21.10.4 Signal handlers [support.signal]

Вызов функции 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]) этой переменной.