Итак, у меня есть приложение, которое отлично компилируется на windows, linux и несколько вариантов unix. Недавно я решил отправить его в OSX, когда я столкнулся с проблемой.
У меня есть шаблон, который выглядит так:
template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }
идея состоит в том, чтобы предотвратить расширение знака от сбоев определенных реализаций при заданных входных значениях выше 0x7f
. Он обычно используется следующим образом:
safe_ctype<std::isspace>(ch);
Это, к сожалению, не работает на OSX (с использованием gcc 4.2). Ошибка связана с тем, что std::isspace
не имеет внешней привязки и поэтому не применим для шаблонов. Оказывается, что в OSX заголовок ctype.h
имеет все функции (через макросы), отмеченные static inline
.
Вот мой вопрос:
Разрешен ли какой-либо соответствующий стандарт для функций в стандартной библиотеке С++ (в данном случае части, унаследованной от C), чтобы не иметь внешних связей?
EDIT:
Я слышал от яблока. По-видимому, у них есть макрос, чтобы контролировать это поведение. Определение _DONT_USE_CTYPE_INLINE_
предотвращает статические встроенные функции ctype.