После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
Пространство имён std не резиновые.
В общем я теперь агитирую только using std::something или явное std::something.
Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, _NN_, Вы писали:
_NN>>Есть ещё кто пишет using namespace std ?
_NN>>https://en.cppreference.com/w/cpp/concepts/predicate
KP>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
Проблема из-за того, что с каждым новым стандартом в пространство имён добавляют всё больше и больше символов, тем самым увеличивая риск пересечения локальных имён.
Вот у нас был predicate, с новым стандартом появился std::predicate и код перестал собираться.
И это не первый раз, а дальше будет только хуже
Здравствуйте, Михaил, Вы писали:
KP>>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
А там начинается веселье уровня "откуда ты сказал". Конфликт имен и начинают подставляться вызовы функций, которые ты не ожидаешь. Вот крайне показательный пример.
По большому счету, единственное что я считаю допустимым делать с пространствами имен это создавать сокращения. Такое на проекте скорее положительно сказывается, если не перестараться, конечно.
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
_NN>В общем я теперь агитирую только using std::something или явное std::something.
ИМХО, это в равной степени относится и к другим пространствам имен, не только к std. Using directives (не путать с using declarations) если и могут применяться, то скорее как исключение из правил.
В моей практике можно выделить пожалуй единственный случай, когда я позволяю себе использовать using директиву — это когда какой-нибудь отдлельный юнит тест требует определения каких-то дополнительных специфических сущностей. Вот тогда я создаю в cpp файле, в анонимном пространстве имен дополнительный namespase с таким же именем как функция-член. И после этого использую using директиву внутри одной отдельно взятой функции, даже не во всем cpp файле. То есть такое пространство имен логически можно расссматривать как некое расширение функции-члена:
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
т.е. ранее ты сам определил predicate в std?
_NN>Есть ещё кто пишет using namespace std ?
только в хелловордах =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
_NN>>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
X>т.е. ранее ты сам определил predicate в std?
Да почему в std-то? В том пространстве имен, где использовалась using директива же.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Михaил, Вы писали:
KP>>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
Неприятности могут быть разные. Самое простое — это ошибки компиляции из-за конфликта имен. Но это пол беды, поскольку это не пройдет незамеченным. Гораздо хуже, когда в ADL, вдруг начинает выигрывать совсем не та функция, на которую ты рассчитываешь. Особенно это актуально для функций операторов (сравнения, арифметических, ввода-вывода и пр.). В этом случае компилятор уже не поможет и ты долго и нудно можешь искать причину, по которой программа работает не так, как нужно. Ну и, пожалуй, главная проблема в том, что то, что сегодня нормально работает, завтра может поломаться в результате безобидных, на первый взгляд, изменений в другом пространстве имен. Избыточная связность кода — вот, что плохо.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
Мне на С бы ваши С++ проблемы
_NN>В общем я теперь агитирую только using std::something или явное std::something.
_NN>Есть ещё кто пишет using namespace std ?
Если у проекта Super Application аббревиатура SA, то я называл свои классы не predicate, а SAPredicate, и о проблемах пересечения namespace узнал из этого топика. Но вы можете продолжать дуть щеки от того, что ваш код пестрит ::, <> и &&. Чем сложнее код, тем сильнее программист, воистину.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
_NN>В общем я теперь агитирую только using std::something или явное std::something.
_NN>Есть ещё кто пишет using namespace std ?
_NN>https://en.cppreference.com/w/cpp/concepts/predicate
Максимум, делаю using в локальной области видимости (не больше, чем функция). Например, если дофига работы с временем, то внутри метода можно сразу развернуть chrono.
Здравствуйте, lpd, Вы писали:
lpd>Если у проекта Super Application аббревиатура SA, то я называл свои классы не predicate, а SAPredicate, и о проблемах пересечения namespace узнал из этого топика. Но вы можете продолжать дуть щеки от того, что ваш код пестрит ::, <> и &&. Чем сложнее код, тем сильнее программист, воистину.
А затем код вытаскивается в shared library, и опа! Что такое SA? Почему? Зачем? Да и авторам Silver Application тоже грозит name clash с этим Super Application.
Из наиболее известных ляпов такого рода — Apple со своими префиксами NS (Next Step). Проект Next Step давно неактуален, но "ложечки остались". Новые API не используют NS-префикс, и теперь у Apple SDK очень полосатый naming convention.
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
clang тоже не одобряет.
Здравствуйте, TimurSPB, Вы писали:
_NN>>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. TSP>clang тоже не одобряет.
Так не я же добавил predicate в std, а стандарт
Нет, мы так не делаем. А еще мы моем руки перед едой и чистим зубы.
Ну что за детсад, ей-богу? 20 лет везде пишут, что using namespace std в namespace scope — зло. И вдруг в конце 2019 года внезапно приходит осознать что таки "папа был прав".
Здравствуйте, _NN_, Вы писали:
_NN>В общем я теперь агитирую только using std::something или явное std::something. _NN>Есть ещё кто пишет using namespace std ?