Печать

Этот пост о бубне,но не о серверной. Это пост о Страуструпе, С++ и локалях-фасетах.

Не было у админа проблем, решил админ нормально изучить C++... ну, чтоб серьёзно, с STL, стандартными контейнерами, итераторами, вот это всё. Надо же писать нормально, а не на С классами... С++11\17 опять же...

Подозрение о том, что STL придумана инопланетным (т.е. не человеческим) разумом - закралось, естественно, довольно быстро. Но после ознакомления и интенсивных эротических приключений в попытках написать простенький кроссплатформенный Hello World, умеющий в кодировки - слов у меня уже нет, за исключением матерных. И я сейчас старательно пытаюсь перевести их на нормальный язык.

Мало того, что нормальной поддержки кодировок в STL в принципе нет, а то что есть - использовать можно только после подключения сторонних библиотек или самопального велосипеда. Мало того, что в C++11 вроде-бы двинулись в сторону нормальной реализации, но в C++17 эти нововведения объявят устаревшими и выкинут. Почему? Авторы стандарта говорят что идите на..фиг, вот почему, пользуйтесь сторонними библиотеками. Но это всё полная фигня, в конце концов можно написать велосипед или подключить ICU. Горю я по другой причине.

Основная беда в том, что STL придумал Страуструп. Я не знаю почему у рептилоидов (или кто он там) модно писать столь вычурные конструкции там, где хватило бы чего-то простого как кирпич. Я даже понимаю что универсальность и одинаковый подход к любому контейнеру или алгоритму - это в общем-то круто. И даже сама система локалей как контейнеров для фасетов, которые в свою очередь умеют всё то, что от локали требуется - вполне логична и правильна, пусть и слишком имхо раздута. Но... %?*%, почему нельзя было эту систему сделать так, чтобы она не зависела от платформы, от того как именно были собраны и слинкованы разные библиотеки... и самое главное - за каким хреном было завязывать идентификацию фасетов на значения статических, создаваемых при компиляции объектов. Наверное затем чтобы программа рандомно падала если часть id фасетов лежат в бинарнике программы, а другая часть в динамической библиотеке - не иначе. Именно это происходит при сборке динамических библиотек boost:locale с icu под windows.

Лечится - в моём случае помогла полностью статическая линковка. Полдня общения с гуглом дали два намёка что надо наоборот полностью отключить генерацию статических библиотек boost при сборке оного и тогда там случится что-то волшебное и динамические библиотеки тоже не будут путаться в id фасетов - пока не проверял, но возможно и это заработает, ибо в линуксе работает и при динамической линковке с boost.

Но когда-нибудь, хотя скорее это будет и никогда, но "никогда" - лишь значение итератора за последним элементом... В общем, если мне будет нечего делать - я напишу свою обёртку вокруг ICU, с... нет, скорее уж без локалей и фасетов. Потому что у меня горит. Хочется взять и... разломать монитор. Такие дела. Спасибо за внимание :).

www.38i.ru