Ответ 1
С++ 03 §17.4.2.2/1 говорит:
Сущности в стандартной библиотеке С++ имеют внешнюю связь.
То же самое верно в C: C99. §7.1.2/6 гласит:
Любое объявление библиотечной функции должно иметь внешнюю связь.
Итак, у меня есть приложение, которое отлично компилируется на 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.
С++ 03 §17.4.2.2/1 говорит:
Сущности в стандартной библиотеке С++ имеют внешнюю связь.
То же самое верно в C: C99. §7.1.2/6 гласит:
Любое объявление библиотечной функции должно иметь внешнюю связь.
Заголовок OS X <ctype.h>
защищает нестандартные встроенные версии с проверкой того, что вы не компилируете в режиме стандартов.
Если вы не сообщите компилятору, что хотите согласования, вы не получите соответствия. Это справедливо практически на всех платформах, но по-разному.
Если вы хотите все тонкости расширений и что нет, и поэтому не хотите требовать строгого соответствия, вы можете определить _DONT_USE_CTYPE_INLINE_
перед включением заголовка, и вы получите не-встроенные версии функций с внешней связью.
Как насчет использования "cctype" (я имею в виду под угловыми скобками) вместо "ctype.h". В любом случае, я бы предпочел старомодный заголовок.