- 1
- 2
Почему весь С++ засран явными неймспейсами std:: ?
Если из-за коллизий, то почему с этим нету проблем в C#, Java?
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
Почему весь С++ засран явными неймспейсами std:: ?
Если из-за коллизий, то почему с этим нету проблем в C#, Java?
А в "C#" всё засрано System. и Microsoft.
1. В старых версиях "C++" не было поддержки неймспейсов.
2. "STL" не сразу стала стандартом. Раньше были другие «стандартные» библиотеки, у каждого компилятора своя.
Вот это всё стало стандартом только во второй половине 1990-х, а учитывая, что тогда в порядке вещей было использовать старые версии кокококонпеляторов и библиотек, процесс внедрения "STL" растянулся на долгие годы.
Чтобы подчеркнуть принадлежность именно к "STL", явно пишут префикс std:: (а то вдруг проект использует аналогичные имена из других библиотек).
"Java" и "C#" разрабатывались сразу с поддержкой неймспейсов и сразу со стандартными библиотеками, поэтому в них всё по-другому (хотя нужно заметить, что для "Java" существуют и «нестандартные» библиотеки).
да, именно это я имел ввиду.
все понял. спасибо.
http://aras-p.info/blog/2018/01/12/Minimizing-windows.h/
но так-то есть возможность вынести специализацию 100 этажного шаблона в .cpp файл из 2 строчек, чтобы компилятор там поднапрягся, инстанциировал всё что надо, сохранил в .o, и при трансляции всего остального уже не сходил с ума, а просто при линковке туда уже обратился - я так делал когда-то, когда кокомпилятор студии просто валился с внутренней ошибкой из-за превышения потребления оперативной памяти
Бустовая метушня?
тем более, что грамматика там очень близко к исходному заданию визуально описывалась, было красиво
с тех пор больше не доводилось сталкиваться, что компилятору не хватает 12ГБ рам, но и на крестах я уже давно не писец правда
Я никогда конечно не осуждаю то, что происходит между двумя consenting adults, но такое...
SimpleFix версии 2.0 не требует установки .NET Framework. Инструкция по установке Python 3.0.5 находится на сайте python.org. (обратите внимание, на 64-битных системах при прописывании переменной PATH нужно заменить Program Files на Program Files x86) Внимание! Перед установкой Python3 нужно удалить предыдущую версию Python2.
По крайней мере, в MSVС так, но и в GCC, наверное, дожна быть статически линкуемая версия crt...
Тем не менее, почти вся проприетарщина идёт со статической линковкой. Ибо иначе заебёшься собирать под 100500 вариаций линупсов. Ну или просто тащит с собой мешок либ.
This. Для обоснования было бы неплохо почитать чейнжлоги VS CRT, узнать, сколько там улучшений и исправлений обычно…
16.
Ага, с ASLR dll'ки очень хорошо шарятся.
В венде то? Особенно на 32 битах, где нет ip-relative адресации и вообще регистров мало?
Угу.
https://github.com/jgaa/restc-cpp/wiki/Building-under-Windows
Краткое содержание: ебитесь как хотите!
Блядь, не напоминай... Я недавно конпелятор для циклоняшки так запинывал (правда там редхат а не центось в требованиях). В итоге сдался и засунул его в виртуалку.
Там гуйня есть, поэтому влом было с докером ебаться. С виртуалкой проще, думать не надо.
Да хуй знает что у них там с совместимостью между версиями... Ещё какие-нибудь артефакты полезут или вообще крашнется. Зачем мне потенциальный пердолинг?
З.Ы. Эта хуйня столько жрёт и весит, что оверхедом виртуалки можно тупо пренебречь.
Кто всё это переписывать будет? Там что-то на Qt, что-то на эклипсе, что-то на свинге, что-то вообще на tcl/tk... Ёбаный зоопарк, короче.
Уже представил себе, как командир в окопе под обстрелом пытается починить рантайм Вижул-Барсика.
https://i.pinimg.com/originals/fc/df/9d/fcdf9d9489314ec2162fb0eae2cea75a.jpg
К слову, нужную функцию (перевод прямоугольных декартовых координат в полярные и обратно) инженерные микрокалькуляторы выполняют одной кнопкой. И ещё несколько подобных команд.
Еще когда-то использовал что-то типа:
А вдруг следующая версия «Windows» снова будет поддерживать сегментную модель памяти, тогда слово «far» снова пригодится?
>> Well, Microsoft's rpcndr.h (whatever that is) has "#define small char".
А потом люди не верят, когда им говорят, что макросня –— зло.
Т. е. типа вы можете у массивов указать обе границы индекса, как в «Паскале», но наш кококонпелятор не сможет такое скококонпелировать, поэтому лучше укажите нижнюю границу, равную нулю, или просто кококоличество элементов, как в «Си».
Давайте включать в документацию всё, что мы не собираемся поддерживать. Например, объявим ключевое слово для грабежа корованов, но напишем, что наш кококонпелятор грабить корованы не сможет. Вот здорово будет!
Ну может быть IDL - общий язык, а эта конретная реализация просто не умеет не с нуля.
http://gopher.floodgap.com/gopher/
http://govnokod.ru/24557#comment424007
Оно вроде во всех паскалях есть –— разделы interface и implementation в модулях.
1. В разделе модуля.
2. В ООП как хитрая разновидность класса с обсрактными методами, да ещё и с поддержкой COM.
* строковые операции крайне медленные
* много несовместимых между собой типов, привязанных к кодировке (в RAD Studio ввели универсальный тип UnicodeString, не базирующийся на BStr, памятью управляет само приложение, но среда при этом - ужасное говно)
Вывод: строк, этого уродливого наследия Visual Basic, не должно быть в принципе; ручками выделил память - ручками освободил, как в C. В пасцальных языках в качестве "строк" нужно явно использовать Array of char. Меньше ёбли с подсчётом ссылок, меньше ёбли с реаллоками памяти==прирост скорости.
Речь сейчас не о скорости запуска, а о скорости исполнения бинаря.
Никто не заставляет использовать "VCL".
Например, склейка, присваивание и любые другие, где строка модифицируется.
Строки иммутабельны, т.е. при изменении данных всегда происходит изменение значения счётчика ссылок, а также неявное выделение/освобождение памяти (причём - по каждому чиху). Как бы ни старался опытный программист оптимизировать свой код (минимум кода, асмовставки, не более 3 параметров у методов) строки всё равно окажутся самым дорогим удовольствием.
В делфи то же самое, но лишь до той поры, пока ты не попытаешься изменить строку. В этом случае компилятор ловко подсунет тебе новую копию.
В BP строки были мутабельными, но там этого добились путём ограничения размера строки. Если ты помнишь, string[N] сразу выделял память под N символов (если размер не указан, подразумевалось 255) и превысить этот размер было нельзя.
Скопированный из Си тип PChar допускал изменение на месте, но опять же только в том случае, если ты не пытаешься изменить размер.
Я хз есть ли функция StrRealloc, но если вызвать просто ReallocMem, то предыдущее содержимое буфера не затирается. Я хз, баг это или фича.
Оказалось, что поведение ReallocMem напрямую зависит от менеджера памяти. Как правило, предыдущее содержимое буфера сохраняется.
На практиме может пригодиться если, например, была у нас структура данных, которую можно оптимизировать (например, куча и сборка мусора). Если попало в тот же блок - ладно, получаем бесплатно. Если в другой - всё равно копировать и хэндлы менять - сделаем малую сборку мусора.
В «Windows» есть функции «LocalReAlloc» и «HeapReAlloc», которые можно попросить ничего не выделять и ничего не копировать (т. е. вернуть ошибку), если выделенный блок нельзя оставить на старом месте. Их также можно попросить не обнулять новый кусок памяти при расширении.
P.S. Пора уже Вам регистрировать учётку cnpaBo4HbIu_nemyx, 6u6JIuonemyx или nemyx-3HATOK.
Пишут, что в «glib» реаллокацию сделали как-то по-хитрому через «mremap», но я ничего не понял.
http://govnokod.ru/22504
Но это всё несерьёзно, потому что у них в библиотеке воссоздаётся некое подобие VM.
P.S. Язык «Vala» кто-нибудь изучал?
https://www.youtube.com/watch?v=G9Oj3e1XCRg
Именно поэтому я за "ShortString" (это тот string, который был в "BP 7.0"), потому что у него нет никаких ссылок.
Дурным тоном считается не «using namespace std», а любой «using namespace» в принципе, т. к. он засирает текущий скоп непредсказуемым числом символов и делает программу менее читабельной.
Когда ты видишь в незнакомом коде std::ios_base, ты сразу понимаешь, что ios_base — это не специфичный для проекта класс для iOS, а что-то из стандартной библиотеки, что можно найти на cppreference.
Более того, поскольку число импортируемых символов не предсказуемо, код может перестать компилироваться, если в импортируемый целиком неймспейс в будущем добавят символов, т.к. это может создать неоднозначность.
В жабе во многих гайдлайнах импорты со звёздочкой тоже считаются дурным тоном.
using std::string;
в .cc файле (НЕ В ХЕДЕРЕ!). Это не мешает читабельности и не создаёт потенциальных проблем.
Для сторонних библиотек я всё же предпочитаю выписывать неймспейс явно. Если неймспейс длиннее 5 букв, я обычно создаю алиасы (ТОЖЕ НЕ В ХЕДЕРЕ), например
namespace fs = boost::filesystem;
да.
А что если надо импортировать две разные версии библиотеки, где все эти неймспейсы тупо совпадают (Нахрена это может быть нужно? Например для сравнения работы разных версий, если это какие-то числодробные библиотеки.)?
Вообще, эта блядская пидоросня с неймспейсами - ее еще хрен реализуешь по стандарту, и куча всяких багов с этим говном есть:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51577 например этот баг живет аж с 2011 года, чего-то там в неймспейсе находит, но не должно находить.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87208 и вот это еще, этот относительно недавний, но тоже косяк с этим перегрузочным бредом и неймспейсами
придумали еще кучу каких-то припизданутых правил чтоб какое-то там перегруженное говно в говнонеймспейсе искать https://en.cppreference.com/w/cpp/language/adl
В общем лучше бы это обдристанное неймспейсное дерьмище с припизданутыми правилами поиска перегруженного говна в говне вообще не существовало. Чтобы не было сложностей с корректной реализацией всего этого, чтобы не был стандарт на дохреннилиарт страниц, описывающий всякие ебанутые моменты что вот что-то ищется там, а потом вот там и вот там... блядь, да пошли вы нахер, мне не вызубривать ваши ебанутые фантазии надо, а код писать
Если совпадают ещё и символы в неймспейсах, то нельзя. Из-за нарушения ODR, линкер только одну функцию с заданным именем возьмёт. Это не сильно зависит от языка, так нельзя делать ни в сишке, ни в хаскеле.
Собери себе два бинарника с разными версиями либ, так все делают.
Вообще-то это решаемая проблема. Ну т.е. это можно было бы решить на уровне языка (приделать говнорасширения какие-нибудь), но ни в Си, ни в крестах это на уровне языка не решается.
Т.е. допустим у нас есть некий гипотетическй язык, типа особая улучшенная сишка, и файлы main.c и library_v1_0.c library_v1_1.c library_v_1_0.h library_v_1_1.h
Пусть library_v1_0.c и library_v1_1.c предоставляет нам некую функцию do_shit(). Предположим, что мы хотим из main.c и оттуда и оттуда эту хрень вызывать.
Ну что ж, это можно решить, если процедуру линковки описывать каким-то хитрым образом в самом исходнике, и делать декорирование имен.
Ах да, еще можно тупо менять символы в объектниках, например через
и
https://sourceware.org/binutils/docs/binutils/objcopy.html
--redefine-sym old=new
Change the name of a symbol old, to new. This can be useful when one is trying link two things together for which you have no source, and there are name collisions.
--redefine-syms=filename
Apply --redefine-sym to each symbol pair "old new" listed in the file filename. filename is simply a flat file, with one symbol pair per line. Line comments may be introduced by the hash character. This option may be given more than once.
В принципе, взаимодействие крестов с COM на такой хуйне и замутили.
Всё остальное сводится либо к чисто сишному интерфейсу либо к ёбле с манглингом, который даже с разными версиями одного конпелятора не всегда стыкуется.
Но это ж говно.
?
Почему эту херню нельзя как-нибудь автоматизировать, без всей этой хуйни? Ну пусть даже каким-нибудь блядогенератором, который нагенерит эту парашу с dlsym-ами и экстернами, если крестометушня такое делать не позволяет.
Верхнюю херню в макрос завернёшь. Она, как правило, нужна всего один раз на модуль чтобы получить его корневой интерфейс. Остальную требуху ты уже у него попросишь.
А нижняя херня заворачивается в няшную RAII'шную обёртку.
Т.е. будет как-то так:
которые надо уметь вызывать, то ты это говно будешь вилкой чистить руками заворачивать с extern "C" в некое говно вида
да ?
Или для этого уже написали какие-то гомоиконы кодогенерации?
З.Ы. В биндингах к Qt можешь посмотреть как выглядит настоящий хардкор - использование неадаптированных крестолиб из другого языка. Но у Qt ABI стабильное в отличие от всякой стдушни, могло быть и хуже.
Куд-куд-куд-куда-а-а-а!
Повсюду только стертор и мерещицца. давайте флудить и троллить
(=_=)
–— А мы после 35 на переподготовку не берём.
—– Мне 35 только три дня назад исполнилось.
–— Ну вот три дня назад и приходили бы.
—– Не мог я три дня назад прийти. Я в тюрьме сидел. В Бутырской.
—– Давайте! У Вас есть глисты?
–— Нет.
—– Но ведь это же прекрасно!
А чем его надо засирать? Говном? Ну это можно:
Перегрузка неймспейса через препроцессор
https://ideone.com/0SKmJB
https://ideone.com/qWOGgZ
Нафига им отдельные кнопки «save» и «submit»?
https://ideone.com/tAv50R
ЛОЛОЛОЛЛО
2) легко. вызывай .clone() :)
3) а структуры которые не в свойствах класа думаешь где хранятся? или думаешь они по поинтеру передаются :)
4) есть немного но думаю скоро и тут придумают как обойти
это в жабе дженерик на обжект заменяется и потому нельзя перегрузку делать.
в сишарпе же дженерик в рантайме имет конкретный тип, который, коль надо, через рефлексию можно узнать (привет dependency injection). и перегрузки тоже работают с дженериками.
я бы сказал не 80%, а в 98% случаев нахуй никому не уперлось факториалы через темплейты считать. кроме как const int pituh = 60*60*24*365 и конкатенации строк вообще не понимаю, коим хуем тебе еще что-то надо считать в компайл тайме? кому нахуй вообще уперлость факториалы считать, ты когд их-то блять считал последний раз? так что не пизди.
на счет перегрузок, ты мне ща задвигаешь какую-то дичь. какием хуем твой кусок код соотносится с этой фразой?
>> С генериком у тебя не будет работать перегрузка по типу потому что класс-то один.
вот жабе, из-за недоженериков, как раз такое не канает:
т.к. после конпеляции все будет List, т.е.:
но в шарпе все пучком. а то что ты нарисовал, здесь вообще никоим боком.
Любой адекватный программист на C++ знает, что по-другому и не сделаешь. Именно поэтому я за «C++».
Указатель всегда одинаковый, и так как знание о типе есть в рантайме у .NET то можно сделать указатель типа object, и просто явно его проверять и кастить под капотом.
Зачем плодить кучу классов?
С валуе обжектами ситуация другая: можно конечно их боксить как в джаве, но это будет супер неоптимально потому что потребует еще места в куче и указатель.
Потому .NET пошли на хитрость.
Джава так не умеет, и традицийно отсосала хуй, и потому List<Integer> сильно больше и тяжелее чем int[], а в .NET они примерно сравнимы.
В С++ _всегда_ инстанциируются новые классы. Иногда это реально не нужно: например зачем тебе 20 классов с указателем? И тогда люди идут на хитрость через partial template specialization (Частичная специализация)
Ну то-есть как всегда: в С++ можно сделать как хочешь, C# за тебя автоматом делает хорошо, а Java за тебя автоматом делает так себе)
В C++ работает, не сарказм.
Даже есть примеры, когда автор программы упарывается настолько, что это пригождается:
https://www.boost.org/doc/libs/1_51_0/libs/spirit/classic/example/fundamental/full_calc.cpp
IComparable например, имеено так и работает. и им обмазы все стандартные типы чтобы мамкины кодеры могли делать естественную сортировку, не указывая функцию-компаратор, а-ля Array.Sort(pituhi).
https://github.com/louthy/language-ext
Есть те, кто пишет на „Паскале“. И те, кто считает, что пишущие на „Паскале“ не нужны.
Есть те, кто пишет на 『Ruby』. И те, кто считает, что пишущие на 『Ruby』 не нужны.
Есть те, кто пишет на “Lua”. И те, кто считает, что пишущие на “Lua” не нужны.
Есть те, кто пишет на крестах. И те, кто считает, что <их собственная жизнь тлен, и> они не нужны.
Непересекающиеся биомассы.
Не, ну я вот например могу что-то на крестах написать вполне, на шаблонах могу рекурсивного говна понаписывать.
Или под "писать на крестах" подразумевается что-то большее, типа профессионально на крестах что-то пилить за зарплату? Ну а с чего б нелюбителю крестов этим заниматься? Логично, что подобные люди будут избегать подобной работы.
Забавно другое - чем больше я узнаю кресты, тем меньше мне кресты нравятся. В самом начале я эти кресты воспринимал как просто такое улучшение, типа "круто, тут еще какой-то свой препроцессор, который назвали шаблонами", "круто, тут еще по ссылке передавать можно", "круто, какие-то классы-хуяссы", а когда вникаешь поглубже во все это дерьмище, то хочется побыстрее съебать обратно в сишку. Особенно если почитать какого-нибудь кода с этими классами, шаблонами и перегрузками
http://govnokod.ru/25289#comment449750?
Вот если ты на плюсах писать начнешь то Линус тебя лично нахуй пошлет
Я бы сказал, пересечение множеств тех, кто реально пишет на языке и тех, кто считает, что он не нужен или крут, пропорционально выразительности языка и обратно пропорционально пердольности и порогу вхождения (с округлением до целых)
Если некто обсирает кресты (и при этом не является j123), то вероятнее всего он про кресты ничего не знает, но преподаватель по джаваскрипту сказал ему, что кресты устарели
Мы вынуждены принимать кучу утверждений на веру т.к. проверять всё снуля долго и дорого. И это абузят все кому не лень.
Вот например ты наверное думаешь, что земля имеет форму шара, чуть сплюснутого у полюсов, да?
А почему ты так думаешь? Разве ты когда-нибудь видел землю из космоса?