Объем библиотек C в C++ - <X.h> по сравнению с <cX>

Язык Программирования на C++: Специальный выпуск указывает на странице 431 это...

For every header < X.h > defining part of the C standard library in the global namespace and also in namespace std, there is a header < cX > defining the same names in the std namespace only.

Однако, когда я использую заголовки C в <cX> стиль, я не должен квалифицировать пространство имен. Например...

#include <cmath>
void f() {
  double var = sqrt( 17 );
}

Это скомпилировало бы прекрасный. Даже при том, что в книге говорится, что использование <cX> заголовка определяет имена в пространстве имен станд. только, Вам разрешают использовать те имена, не квалифицируя пространство имен. Что я пропускаю здесь?

P.S. Используя компилятор GNU.GCC

5
задан Anonymous 22 January 2010 в 15:53
поделиться

5 ответов

При условии, что отсутствие вложенности не упрощает его на уровне, где можно использовать Regex. Regeex, чтобы соответствовать, которое было бы (при условии, и / или только, может быть легко расширено):

>>> expr = 'a and (b and c) and d or e and (f or g)'
>>> regex = re.compile('\((\w+)\s+(and|or)\s+(\w)\)|(\w+)')
>>> results = regex.findall(expr)
>>> results = [i[:3] if i[0] else i[3] for i in results]
>>> results
['a', 'and', ('b', 'and', 'c'), 'and', 'd', 'or', 'e', 'and', ('f', 'or', 'g')]

Теперь у вас есть части скопик, как кортежи из 3 строк (операнд-оператор-операнда), а остальная часть строки в виде строк для каждого токен (оператор или операнд).

Вы можете пройти через список, оцените каждое выражение в скобках и замените его результатом. Как только это сделано, вы можете снова пройти через него и оценить либо слева направо или в соответствии с некоторыми правилами приоритета, которые вы устанавливаете (например, продолжайте оценку и только до тех пор, пока вы не запустите и не запускаете, а затем начать оценку или начать).

-121--5044701-

Стефан Т. Лававей, член команды MSVC, обращается к реальности этой ситуации (и некоторые уточнения в стандарте) в этом комментарии на одном из его проводков в блоге ( http://blogs.msdn.com/vcblog/Archive/2008/08/28/the-mallocator.aspx#8904359 ):

> также , , а std :: size_t ETC следует использовать!

Раньше я был очень осторожен в этом. C ++ 98 имел великолепную мечту, где > будет объявить все в пространстве имен STD, а будет включать , а затем Перетащите все в глобальное пространство имен с использованием-деклараций. (Это D.5 [DEFR.C.HEDERS].)

Это было проигнорировано множеством исполнителей (некоторые из которых имели очень мало контроля над заголовками стандартных библиотек станданты C). Итак, C ++ 0x был изменен на соответствие реальности. Настоящая в рабочем документе N2723, http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf , сейчас Гарантированно объявляет все в пространстве имен STD, и может не объявить вещи в глобальном пространстве имен. является противоположным: гарантированно объявлено все в глобальном пространстве имен, а может или не может объявлять вещи в пространстве имен STD.

На самом деле и в C ++ 0x, в том числе не является защитой от всего, что в любом случае в глобальном пространстве имен. Вот почему я перестаю беспокоиться с .

Это была библиотечная проблема 456, http://www.open-std.org/jtc1/s22/wg21/docs/lwg-defects.html#456 .

(C ++ 0x все еще устанавливает заголовки [11409900] заголовков из стандартной библиотеки C, которая веселая.)

Я в 100% соглашении с Lavavej, кроме я никогда Попытался быть очень осторожным по поводу использования в заголовков стилей <1140871] <1140872] <1140872] [CFOO> ? Никогда не было никакой реальной мировой пользы для использования в заголовках .

9
ответ дан 18 December 2019 в 07:54
поделиться

Правило для библиотек C отличается от библиотек C ++ для пространств имен

GCC интерпретает стандарт в Docs как

Стандарт указывает, что если кто-то включает в себя Заголовок C-стиля ( в этом случае) символы будут доступны в глобальном пространстве имен и, возможно, в пространстве имен STD :: (но это больше не является твердым требованием.) Одна другая рука, включая C ++. -пинчатый заголовок () гарантирует, что объекты будут найдены в пространстве имен и, возможно, в глобальном пространстве имен.

В проекте C0X ++ SPECT он говорит в разделе 17.6.2.3 Заголовки

Не указано, будут ли эти имена сначала объявлены в глобальном пространстве пространства имен и затем вводят В пространство имен STD от явных с использованием-декларациями

6
ответ дан 18 December 2019 в 07:54
поделиться

Это трудно исправить это без реализации библиотеки C дважды. См. DR 456 , который в основном предлагает отказаться от проблемы.

4
ответ дан 18 December 2019 в 07:54
поделиться

Вы, вероятно, отсутствуете с использованием соответствия стандартов компилятора (или тот, который вы используете, настроен для совместимости с предварительно стандартным кодом).

0
ответ дан 18 December 2019 в 07:54
поделиться

Почему вы говорите "Это будет хорошо компилироваться", когда он нарушает Стандарт? Кто позволяет использовать эти имена, не определяя пространство имён? Вы тестировали это на конкретной реализации и обнаружили, что она работает?

Я настоятельно не рекомендую использовать какую-то определенную нестандартную возможность, так как она случайно работает на выбранном вами компиляторе. Такие вещи легко ломаются, возможно, в более поздней версии того же компилятора.

1
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: