Итак, у меня есть приложение, которое прекрасно компилируется на 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 ++ (в данном случае это части, унаследованные от C) не иметь внешней связи?
EDIT:
Я слышал от яблока. Видимо, у них есть макрос для управления этим поведением. Определение _DONT_USE_CTYPE_INLINE_
предотвращает статические функции ctype.