Состояния спецификации языка C++: процесс вызова деструкторов для автоматических объектов, созданных на пути от блока попытки до выражения отсеивания, называют раскручиванием “stack. ” Ваш исходный код не содержит блок попытки, именно поэтому складывает раскручивание, не происходит.
Вы не можете проверить определение типа, как вы можете для макроса, так что это немного сложно. Если вы используете autoconf
, этот патч показывает минимальные изменения, необходимые для проверки autoconf на наличие errno_t
и определения его, если он отсутствует ( typedef будет помещен в файл, который включает ваш сгенерированный config.h
и включен во все файлы, которым требуется errno_t
). Если вы не используете autoconf
, вам нужно придумать способ сделать то же самое в вашей системе сборки или очень умный набор тестов для макросов версии компилятора.
Microsoft errno_t
является избыточным. errno
определяется стандартом ISO C как изменяемое lvalue типа int
. Если ваш код должен хранить значения errno
, то вы должны поместить их в int
.
Выполните глобальный поиск и замените s / errno_t / int /
и все готово.
Edit: Кроме того, вы не должны указывать typedef int errno_t
в своем коде, потому что все имена, которые заканчиваются на _t
зарезервированы.
Обычно это тот случай, когда на помощь приходит GNU autoconf . Обычно autoconf генерирует сценарий настройки, который может определять различные системные функции, например, существует ли этот тип и как он определен. Затем вы включаете сгенерированный файл заголовка C в свое приложение.
Если вы знаете, какие версии GCC вызывают у вас проблемы, вы можете проверить их. Вы можете проверить наличие версий GCC, используя что-то вроде:
#if __GNUC__ == 3
...
#else
...
#endif