Язык Программирования на 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
При условии, что отсутствие вложенности не упрощает его на уровне, где можно использовать 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> ? Никогда не было никакой реальной мировой пользы для использования в заголовках
.
Правило для библиотек C отличается от библиотек C ++ для пространств имен
GCC интерпретает стандарт в Docs как
Стандарт указывает, что если кто-то включает в себя Заголовок C-стиля (
в этом случае) символы будут доступны в глобальном пространстве имен и, возможно, в пространстве имен STD :: (но это больше не является твердым требованием.) Одна другая рука, включая C ++. -пинчатый заголовок ( ) гарантирует, что объекты будут найдены в пространстве имен и, возможно, в глобальном пространстве имен.
В проекте C0X ++ SPECT он говорит в разделе 17.6.2.3 Заголовки
Не указано, будут ли эти имена сначала объявлены в глобальном пространстве пространства имен и затем вводят В пространство имен STD от явных с использованием-декларациями
Это трудно исправить это без реализации библиотеки C дважды. См. DR 456 , который в основном предлагает отказаться от проблемы.
Вы, вероятно, отсутствуете с использованием соответствия стандартов компилятора (или тот, который вы используете, настроен для совместимости с предварительно стандартным кодом).
Почему вы говорите "Это будет хорошо компилироваться", когда он нарушает Стандарт? Кто позволяет использовать эти имена, не определяя пространство имён? Вы тестировали это на конкретной реализации и обнаружили, что она работает?
Я настоятельно не рекомендую использовать какую-то определенную нестандартную возможность, так как она случайно работает на выбранном вами компиляторе. Такие вещи легко ломаются, возможно, в более поздней версии того же компилятора.