LINUX.ORG.RU

В Си предложили добавить switch-case для строк

 , ,


0

3

Привет, чат!

Спустя много лет, в язык Си наконец предложено добавить возможность использовать выражение switch-case для строк. Например, можно будет писать вот такое:

const char *s = get_some_string();

switch(s) {
case "this":
  handle_this();
  break;
case "that":
  handle_that();
  break;
default:
  handle_other();
  break;
}

Таким образом, в Си будет чуть меньше способов отстрелить себе ноги.

Ссылка на предложение: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3895.pdf



Последнее исправление: hobbit (всего исправлений: 1)

Незачем так торопиться.

в Си будет чуть меньше способов отстрелить себе ноги

немедленно забывает написать break;

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

хорошие мальчики

Напевая песню М. Джексона удаляется из треда лунной походкой, придерживая шляпу

thesis ★★★★★
()

Statement: то есть в дополнение к switch по 1-2-4-8-байьным последовательностям можно будет ходить по массивам с \0 в конце.

Mocking lamentation: куда же катится этот ваш кожано-мешочный си?!

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

Классно, только ещё бы и сами строки туда добавить.

Не, так нельзя. Как тогда сегфолты на ровном месте ловить?

yorshka
() автор топика

Не взлетит, на freestanding implementations нет никакого strcmp. А заставлять компиляторы вставлять неоптимальную реализацию, да ещё и в каждый translation unit, где такое происходит… мда.

shdown ★★
()

Нафиг этот сахар, пусть фичи делают

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

Ты явно не понимаешь, о чём говоришь.

Нет, это ты не понимаешь. Никто не мешает сунуть strcmp в libgcc или её аналог у шланга. Там и так говна хватает, от strcmp оно хуже не станет.

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

«libgcc или её аналог у шланга» — это для hosted environments. freestanding не линкуются с ней и не включают в себя её копию.

В ядре линукса нет libgcc (или её аналог у шланга): если ты там разделишь два uint64_t на 32-битной архитектуре и деление не оптимизируется в сдвиг, линкер тебе скажет, что не нашёл функцию __udivdi3 и сборка повалится.

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

«libgcc или её аналог у шланга» — это для hosted environments. freestanding не линкуются с ней и не включают в себя её копию.

Ну так слинкуй. Никто не мешает ключик -static-libgcc сунуть, благо что libgcc ни от чего не зависит.

В ядре линукса нет libgcc: если ты там разделишь два uint64_t на 32-битной архитектуре и деление не оптимизируется в сдвиг, линкер тебе скажет, что не нашёл функцию __udivti3.

Тем более отлично, видишь? Если не использовать фичу, проблемы нет. Если использовать, то предоставь strcmp сам либо протащи libgcc. Или ты сейчас начнёшь тут городить телегу, что деление в языке тоже нужно убрать, потому что в freestanding его может не быть? Или, может, ты ещё против float в языке, потому что дескать есть платформы без FPU?

yorshka
() автор топика

Какая же гадость эти ваши ASCIIZ строки. Даже плюсовики это осознали наконец.

anonymous
()

я хренею просто, какие бездари всюду лезут со своим тупым вайбкодингом. Этот he/him же просто ничего не понимает в том что попросил написать нейронку.

the labels list string literals, giving the compiler complete, compile-time knowledge of the state space

Consistent with strcmp, if the expression points to a character array that does not contain a null character, the behavior is undefined

какое УБ, бездарь, ты ж только что заявил что все известно во время компиляции?

While a compiler can easily optimize an integer switch into a jump table, an if-else - chain of function calls is difficult to compile into an O(k) dispatch structure

Fallthrough behavior applies exactly as it does for integer switches

да-да, так и представляю себе префиксное дерево с fallthrough behavior

Вердикт: на помойку этот мусор

Lrrr ★★★★★
()

Таким образом, в Си будет чуть меньше способов отстрелить себе ноги.

И ещё добавочка.

Вот что бывает, когда ЯП не знают.
В gcc ведь есть goto по выражению.

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

giving the compiler complete, compile-time knowledge

Согласен вот этот вот точно нейронка писала, и мне кажется я знаю какая.

Fred Veldmeijer is a teacher and assessor within the Information and Communication Technology department at Fontys University of Applied Sciences in Tilburg, Netherlands. He is recognized for supervising student projects, often acting as a second assessor for final thesis and graduation tracks.

Никто и звать никак. Судя по прописке, вполне возможно наркоман. Даже интересно будет посмотреть как его будут посылать.

anonymous
()

веб-макаки проникли в комитет по стандартизации?

Psilocybe ★★★★★
()

Строка - достаточно сложно-структуированный объект и манипулировать им как числами в таком низкоуровнвом языке как Си - неправильно. Даже ASCIIZ -строка это перебор с обобщением.

Psilocybe ★★★★★
()

Спустя много лет, в язык Си наконец предложено

Мне кажется это было предложено намного раньше и уже кучу раз (просто не на сайте open-std.org). Особенно много раз, скорее всего, это предлагалось пхпшниками т.к. в пхп такой свитч существует.

firkax ★★★★★
()

В Си добавят switch-case для строк

Это в очередной раз показывает несостоятельность мнения, якобы Си — не язык высокого уровня.

А неудобства — ошибки дизайна, а не следствие некого философского откровения.

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

какое УБ, бездарь, ты ж только что заявил что все известно во время компиляции?

А что не так? Отсутствие переноса строки в конце файла – тоже UB, хотя все известно во время компиляции.

yorshka
() автор топика
Ответ на: комментарий от kaldeon

Это в очередной раз показывает несостоятельность мнения, якобы Си — не язык высокого уровня.

Это случайный сахарок, который ничего принципиально не меняет. Если в ЯП невозможно абстрагироваться от уровня машинных адресов, то какой может быть высокий уровень. Лучше таких иллюзий не питать.

bread
()

Кстати, в названии темы 4.2. Не «добавят», а «кто-то выдвинул предложение».

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

Предложения, которые кто-то добавил на open-std, зачастую добавляют.

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

Ну так слинкуй. Никто не мешает ключик -static-libgcc сунуть, благо что libgcc ни от чего не зависит.

«Можно, но зачем?»

что деление в языке тоже нужно убрать, потому что в freestanding его может не быть?

То что некоторые типы данных требуют FPU или даже целочисленные, но превышают битность процессора целевой архитектуры - кажется единственное исключение из принципа реализуемости чистого языка без стандартных библиотек. Зачем их плодить?

Тогда вообще надо затащить, наконец-то, нормальные строки в Си, а не это c '\0' на конце, которые в 70-х были удобным хаком, но которые давно стали тормозом для производительности и источником уязвимостей. Но тогда язык вообще во что-то иное превратится.

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

Я даже больше скажу: если в коде на Си происходит много работы с нуль-терминированными строками, скорее всего, это или легаси или ошибка в выборе языка.

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

Наркомания и мерзость. И так то язык доживает свой срок так ещё и глумятся над ним

Наркомания это Duff’s device и дыры в языке, позволяющие такое.

anonymous
()

Зачем?

Фича switch case в C, что под капотом там jump tables и он получается оптимальнее цепочки if, если значений много.

Если строки будут просто последовательным вызовом strcmp, то это ничем не отличается от цепочки if и зачем плодить сущности.

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

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

Ну так слинкуй. Никто не мешает ключик -static-libgcc сунуть, благо что libgcc ни от чего не зависит.

«Можно, но зачем?»

Что значит зачем? Чтобы деление работало, например.

То что некоторые типы данных требуют FPU или даже целочисленные, но превышают битность процессора целевой архитектуры - кажется единственное исключение из принципа реализуемости чистого языка без стандартных библиотек. Зачем их плодить?

Что такое «чистый язык без стандартных библиотек»?

Тогда вообще надо затащить, наконец-то, нормальные строки в Си, а не это c ‘\0’ на конце, которые в 70-х были удобным хаком, но которые давно стали тормозом для производительности и источником уязвимостей. Но тогда язык вообще во что-то иное превратится.

Проще выкинуть нахрен уже этот говновоз и взять нормальный язык. Тут вот Odin релизит версию 1.0.

yorshka
() автор топика

И как это вообще будет работать? Оно будет вызывать strcmp на каждую строку? А что если его нет в библиотеке? И с хрена ли оно решило что нужно именно strcmp или аналогичный интринсик? А что если у меня исходная строка не null terminated? Может там строки фиксированной длины и их нужно memcmp сравнивать? А что будет если у меня строка void* или (un)signed char? При этом никакого == для строк конечно же не появится? Задание для интересующихся на дом - подумать при каких ещё условиях этот case начнёт тупо сравнивать указатели и на динамические строки всегда отдавать false или UB.

Таким образом, в Си будет чуть меньше способов отстрелить себе ноги.

Лол, ни при каких условиях такого не случится. Пока ты базируешься на спонтанно наслаивавшемся без какого либо проектирования копролите которым является C, стараясь ещё и всеми силами сохранить совместимость, будет только хуже.

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

если в коде на Си происходит много работы с нуль-терминированными строками, скорее всего, это или легаси или ошибка в выборе языка

Легаси из 80-х разве что. Хотя матёрые сишники могут и строки теребить, и что угодно вытворять.

bread
()

надеюсь предлагателю оперативно предложили альтернативное предложение, например пройти куда-нибудь, в альтернативное место, альтернативным маршрутом.

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

Легаси из 80-х разве что. Хотя матёрые сишники могут и строки теребить, и что угодно вытворять.

Строки с концевым нулём бывает и весьма уместно использовать, а иногда не нужно о них и вспоминать.

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

Строки с концевым нулём бывает и весьма уместно использовать

Приведи хотя бы один пример.

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

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

Разве мы ещё не привыкли к тому, что компилятор всегда использует самый неочевидный, наименее ожидаемый, и наименее производительный метод? Потому что!

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

Другого языка может «пока» ещё не существовать под целевую платформу, а текстовый редактор, хотя бы в первоначальном виде, набросать надо, а то grep/sed/sort/tail уже задолбали.

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

А jump можно писать в нормальных языках?

VIT ★★
()

Когда переписывал алгоритмы с пыха на 89, то хватало strcmp. И достаточно if.

Неужели этот супер быстрый свитч кейс и правда где часто используется ?! До 5 позиций if else достаточно.

P.S. ну их -эти потрясающие дополнительные средства.

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

Другого языка может «пока» ещё не существовать под целевую платформу, а текстовый редактор, хотя бы в первоначальном виде, набросать надо, а то grep/sed/sort/tail уже задолбали.

Нахрена? Ты собираешься писать код прямо на каждой целевой платформе, под которую пишешь? На удобном макбуке/сынкпаде не нравится запускать привычный редактор, надо обязательно потрахаться?

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

Нет, работа у меня такая, писать для того, на чём пока ещё нет ничего. Чтобы вам потом можно было запустить ваш любимый редактор.

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

Нет, работа у меня такая, писать для того, на чём пока ещё нет ничего. Чтобы вам потом можно было запустить ваш любимый редактор.

Зачем его запускать на целевой платформе? Emacs отлично работать на amd64 и arm64, а больше его запускать нигде не требуется.

yorshka
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.