LINUX.ORG.RU

Чистота кода

 ,


1

7

Вопрос к разработчикам на C++. На сколько толерантно вы относитесь к функциям из стандартной библиотеки C в коде на C++?

Например, к sscanf?

★★★★★

Работает и есть не просит - пусть работает.

Если что-то ломает, то можно и поправить.

Deleted
()
Ответ на: комментарий от dzidzitop

В C/C++ вообще боль от кодировки сорцов. Поэтому никто не хранит не latin1 в сорцах. В современных языках таких проблем нет.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

всё не так просто. этот текст - такой пример.

всё не так просто. этот текст - такой пример.

dzidzitop ★★
()
Ответ на: комментарий от RazrFalcon

на сервере Java - модная, стильная, юникодная. а выше - две «одинаковые» строки. И полностью одинаковые семантически.

А что придёт во время сабмита какой-нибудь формочки на модную жаву - кто ж его там знает.

dzidzitop ★★
()
Ответ на: комментарий от Kuzy

Ты уверен что эти либы нужны в плюсах и для них нету нормальной обертки? В конце концов, обычно ты отвечаещь за выделение памяти, потому - std::vector как минимум.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

совершенно верно. но так-то, и ASCII поддерживает такие фичи

«u\b_n\b_d\b_e\b_r\b» == under

правда, ни разу не видел, чтобы кто-то их использовал

next_time ★★★★★
()
Ответ на: комментарий от RazrFalcon

В C/C++ вообще боль от кодировки сорцов. Поэтому никто не хранит не latin1 в сорцах

как там, в 1993? доллары покупай

anonymous
()
Ответ на: комментарий от next_time

Оверхед от конвертации [u8] в char.
u8 символ в 1-байтовый char не сконвертится. или вы о чём?

Чтобы сконвертировать utf8 в utf32 нужно брать от одного до 4 байт (в зависимости от символа) и сконвертироаать их в 32битный char. Во первых будет оверхед на конвертацию а во вторых будет 4x оверхед по памяти. И выйгрыша никакого в результате не будет, потому что индексация code point'ов никому не нужна, нужны grapheme clusters, а они даже в utf32 не влазят в 32 бита.

pftBest ★★★★
()
Ответ на: комментарий от eao197

Да понятно, что это не проблема, просто лень было заморачиваться, тк это не самое узкое место было.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от next_time

Unicode декларирует полную эквивалентность вышеприведённых строк. Это не способ рисования человечков из значков. ASCII такого не делает. Не нужно смешивать поддержку форматирования для матричных принтеров и семантическое содержание строк Unicode. В Unicode ё и ё эквивалентны, хотя и являются разным набором байт.

dzidzitop ★★
()
Ответ на: комментарий от Kuzy

Не вижу проблемы с тем, чтобы скопировать это в std::string или std::vector в зависимости от нужд.

А говнокода с strcmp-говномя уже насмотрелся - такое пишут только неосиляторы c++ (те, для кого сложно освооить алгоритмы, итераторы и лямбды).

invy ★★★★★
()
Ответ на: комментарий от invy

А говнокода с strcmp-говномя уже насмотрелся - такое пишут только неосиляторы c++ (те, для кого сложно освооить алгоритмы, итераторы и лямбды).

скорее вы не освоили POSIX и врядли расскажете чем отличается std::equal от memcmp, например

что использовать - алгоритмы/итераторы/лямбды или стандартную библиотеку Си зависит от задачи. Довольно смешно иногда смотрятся попытки отдельных неосиливших особей написать «неговнокод»(ц) через жопу.

anonymous
()
Ответ на: комментарий от anonymous

использовать posix api напрямую - верный способ отстрелить себе не только ноги, но и все остальное.

invy ★★★★★
()
Ответ на: комментарий от Kuzy

еще любопытнее потом вылавливать single-event баги таких «оптимизаторов».

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

использовать posix api напрямую - верный способ отстрелить себе не только ноги, но и все остальное.

если вам так страшно от posix api, идите писать на руби для веб. меньше стресса, дольше проживете.

anonymous
()
Ответ на: комментарий от Kuzy

ну, во-первых, за голый strcmp без проверки длины сразу канделябром, во-вторых, если говнофункция из какой-то библиотеки в 2017м году тебе не возвращает длину строки, то такую библиотеку использовать нельзя и точка.

invy ★★★★★
()
Ответ на: комментарий от invy

если говнофункция из какой-то библиотеки в 2017м году тебе не возвращает длину строки, то такую библиотеку использовать нельзя и точка.

какой агрессивный школьник, тебя, наверное, на нормальную работу не берут?) ничего, подрастешь, поумнеешь, точки перестанешь ставить и сразу окажешься востребованым ;)

anonymous
()
Ответ на: комментарий от invy

Зачем нужна проверка длинны на строках с \0?

Парсишь getline-ом поди?

Все что я хотел сказать, это то, что в стандартной библиотеке просто _нет_ нормальных фунций/оберток для_работы_с/над const char*.

Пихать везде овнящий std::string при этом, очень разумно, конечно.

если говнофункция из какой-то библиотеки в 2017м году тебе не возвращает длину строки, то такую библиотеку использовать нельзя и точка.

Особенно если у нее нет альтернатив.

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от Kuzy

Зачем нужна проверка длинны на строках с \0?

Затем что никаких гарантий что там будет 0 нету. Я фигею - 50 лет проблеме, а до сих пор нахдятся те, кто хотят наступать на грабли.

Парсишь getline-ом поди?

Паршу специально предназначеным парсером.

Все что я хотел сказать, это то, что в стандартной библиотеке просто _нет_ нормальных фунций/оберток для_работы_с/над const char*.

Потому что не нужно.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от invy

Затем что никаких гарантий что там будет 0 нету. Я фигею - 50 лет проблеме, а до сих пор нахдятся те, кто хотят наступать на грабли.

Никаких гарантий, что функция отдаст правильную длину строки.
Никаких гарантий, что указатель будет указывать не на мусор за пределами.
Никаких гарантий, что std::string вернется в консистентном соcтоянии.

Что же делать?!

Ах, точно, если либа возвращает битую std::string - значит проблема в либе.

А вот если у либы в доках написано, что там null-terminated string, а возвращает мусор, то это проблема const char* и опасного api.

Ясно, понятно.

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от invy

А, точно, расскажи плиз, что такое консистентное состояние std::string.

А то я не понимаю что-то. Это точно строка вообще?

Это же массив байтиков+длина, да?

А строки то где, строки?

Ща \0 из std::string в xml-и писать начну, ну строка же, правда? Стоп, а какая кодировка?

Ой, я же в другом месте protobuf «строкой» с байтиками кормлю.

Памагите.

Kuzy ★★★
()
Ответ на: комментарий от invy

вот как раз-таки опыт работы учит писать безопасно без экономии на спичках

судя по вашим опусам в этой теме, весь ваш опыт - пара будильников на qt, да домашнее задание по информатике.

anonymous
()
Ответ на: комментарий от Kuzy

Никаких гарантий, что std::string вернется в консистентном соcтоянии.
А, точно, расскажи плиз, что такое консистентное состояние std::string.

Сам придумал - сам и рассказывай.

invy ★★★★★
()
Ответ на: комментарий от anonymous

По существу, я так понимаю, сказать нечего?

invy ★★★★★
()
Ответ на: комментарий от Kuzy

Сравни серьезность ошибок и вероятность их происхождения:

либа возвращает битую std::string

и

  • случайно перезаписал нолик в конце строки (сотни раз такое видел)
  • начал играться с адрессами и случайно не то, ни так ни туда прибавил-вычел-умножил-не так скастовал, ни учел размерность типа
invy ★★★★★
()
Ответ на: комментарий от Kuzy

Я тебе не предлагаю использовать Си строки, я предлагаю их сравнивать. Привет.

зачем вы спорите с агрессивным школьником? не мешайте ему делать уроки и учить раст

anonymous
()
Ответ на: комментарий от Kuzy

Все что я хотел сказать, это то, что в стандартной библиотеке просто _нет_ нормальных фунций/оберток для_работы_с/над const char*

В стандартной библиотеке C++ много чего нет. Например, нет ничего для разработки GUI. Что не помешала появлению туевой хучи GUI приложений на C++, написанных с использованием Qt, wxWidgets, FLTK, FOX, MFC/ATL и пр.

Аналоги того же string_view существуют уже очень и очень давно (например, Google-овский StringPiece).

eao197 ★★★★★
()
Ответ на: комментарий от invy

лучше уж std::strcmp(str, «whatever») вызвать на C строку вместо std::string(str) == «whatever». а почему - ударят канделябром за отвратительный перформанс в какой-нибудь задаче по сортировке массивов строковых данных - станет понятно.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

ASCII такое делает, это же не простая кодировка, а стандарт сообщений для телетайпов, так что вышеуказанное поведение именно что часть стандарта

другое дело, что на практике терминалы и С-строки этот стандарт нарушают

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.