Подтвердить что ты не робот

Имеются ли все функции в стандартной библиотеке С++ для внешней связи?

Итак, у меня есть приложение, которое отлично компилируется на 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.

4b9b3361

Ответ 1

С++ 03 §17.4.2.2/1 говорит:

Сущности в стандартной библиотеке С++ имеют внешнюю связь.

То же самое верно в C: C99. §7.1.2/6 гласит:

Любое объявление библиотечной функции должно иметь внешнюю связь.

Ответ 2

Заголовок OS X <ctype.h> защищает нестандартные встроенные версии с проверкой того, что вы не компилируете в режиме стандартов.

Если вы не сообщите компилятору, что хотите согласования, вы не получите соответствия. Это справедливо практически на всех платформах, но по-разному.

Если вы хотите все тонкости расширений и что нет, и поэтому не хотите требовать строгого соответствия, вы можете определить _DONT_USE_CTYPE_INLINE_ перед включением заголовка, и вы получите не-встроенные версии функций с внешней связью.

Ответ 3

Как насчет использования "cctype" (я имею в виду под угловыми скобками) вместо "ctype.h". В любом случае, я бы предпочел старомодный заголовок.