Все ли функции в стандартной библиотеке c ++ должны иметь внешнюю связь? - PullRequest
10 голосов
/ 26 августа 2010

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

Ответы [ 3 ]

18 голосов
/ 26 августа 2010

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

Объекты в стандартной библиотеке C ++ имеют внешнюю связь.

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

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

3 голосов
/ 28 августа 2010

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

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

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

0 голосов
/ 26 августа 2010

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

...