JayM ответил:
Определение _REENTRANT заставляет компилятор использовать потокобезопасные (т.е. повторно входящие) версии нескольких функций в библиотеке C.
Вы можете искать файлы заголовков, чтобы увидеть, что происходит, когда они определены.
Поскольку мы с О.П. интересовались этим вопросом, я решил опубликовать ответ. :) Следующие вещи происходят с _REENTRANT
в Mac OS X 10.11.6:
<math.h>
получает объявления для lgammaf_r
, lgamma_r
и lgammal_r
.
В Linux (Red Hat Enterprise Server 5.10) я вижу следующие изменения:
<unistd.h>
получает объявление для функции POSIX 1995 getlogin_r
.
Так что, похоже, _REENTRANT
в основном не работает в наши дни. Когда-то он мог объявить много новых функций, таких как strtok_r
; но в наши дни эти функции в основном соответствуют различным десятилетним стандартам (C99, POSIX 95, POSIX.1-2001 и т. д.), поэтому они всегда включены.
Понятия не имею, почему две системы, которые я проверил, избегают объявления lgamma_r
соотв. getlogin_r
, когда _REENTRANT
равно , а не # определено. Мое дикое предположение состоит в том, что это просто историческая ошибка, которую никто не удосужился пройти и очистить.
Конечно, мои наблюдения на этих двух системах могут не обобщаться на все системы, с которыми ваш код может когда-либо сталкиваться. Вы определенно должны все же передавать -pthread
компилятору (или, что менее хорошо, но нормально, -lpthread -D_REENTRANT
), когда вашей программе требуются pthreads.