LINUX.ORG.RU

Новое слово в программировании на C: штатное определение количества элементов в массиве

 ,


1

2

Привет, ЛОР!

Тихо и незаметно во всеми нами горячо любимый язык программирования Си решили наконец добавить новый оператор, возвращающий количество элементов в массиве. То есть, аналог вот такого:

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

Название нового оператора пока не определено, и по ссылке ниже можно проголосовать за понравившийся вариант.

Ссылка на опрос: https://www.allcounted.com/s?did=qld5u66hixbtj&lang=en_US

Статья от автора предложения: https://thephd.dev/the-big-array-size-survey-for-c

Что скажут эксперты в программировании на C по поводу этого нововведения? Нужно ли оно? Станет ли язык Си ещё лучше?

★★★★★

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

Вот интересно, сделают ли выбранное именно ключевым lowercase словом. Осмелятся ли? В теории это сломает некоторый код, где были функции/макросы/переменные и прочее с именами countof в противном случае снова навернут убожество вида _Countof да ещё и с подключением хедера.

EXL ★★★★★
()

Ненужный опрос скрывается за ненужными капчами.

Ах, да, полвека прошло - было ненужно, сейчас тем более - ненужно.

anonymous
()

Особо не нужно, но хуже от него не будет. В принципе этот макрос и так в каждой библиотеке определён.

PS проголосовал за countof, но и lengthof считаю приемлемым. Остальные варианты неадекватны.

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

В смысле «в теории»? Не в теории, а 100% сломает. И не некоторый, а вообще весь код. Поэтому по-любому сделают через _Countof с хедером, это единственный адекватный вариант, никакой другой вариант даже рассмотрению не подлежит.

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

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

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

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

Оно закрываться должно -std=c2y флагом, а когда там будущий стандарт станет дефолтным в GCC воды утечёт много. Кажется дефолтный C-стандарт в GCC до сих пор 2017’ый.

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

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

Ага, и очень элегантно и удобно постоянно дёргать shift/capslock.

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

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

Хороший способ сделать так, чтобы новый стандарт стал никому не нужен. В C сейчас и так новые стандарты отвратительные, многие откатываются на ANSI C, как более стабильный и понятный стандарт, а ты ещё хочешь это насильно сделать.

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

Ну такое себе, я ненавижу такой стиль, в любом случае в C это не так.

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

Не знаю как это должно сломать.

Если кто-то задефайнил countof (я за него проголосовал) и компилит это современным компилятором, то найти и пропатчить это – задача нескольких минут.

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

многие откатываются на ANSI C

Как там на ANSI C с отсутствием однострочных комментариев? Или без flexible array member? Designated initializers? Не говоря уже о restrict и inline.

Я больше проектов вижу юзающих фичи C99. Вот сырой C89, без случайных расширений – это конечно редкость. Может даже более редкость, чем C11, тем более те же часто используемые анонимные структуры и union – это фича C11. Как и static_assert.

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

Не знаю как это должно сломать.

Из-за распространённости препроцессорной макросни возможно могут появиться очень странные side-эффекты.

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

Как там на ANSI C с отсутствием однострочных комментариев?

И с невозможностью объявить переменную в произвольном месте (объявления возможны только в начале стекового окна {тут … }.

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

Не в теории, а 100% сломает. И не некоторый, а вообще весь код.

Не думаю что изменение будет серьёзнее -fcommon который отключили и который действительно сломал сборку огромного количества кода проектов. А с этим countof – наверное так, незначительность.

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

Кстати, интересно что нет опции (или я неправильно понял) на _Countof кейвордом, а countof в стандартном хедере. Это в принципе бы работало как _Static_assert кейвордом и static_assert макросней в assert.h в C11. И в C23 _Static_assert теперь задепрекейчен, а static_assert – кейворд.

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

Да нет никакой причины делать это без хедера. В любом C файле этих хедеров и так 50 штук. Будет 51, ничего страшного. Это уже проверенная методика, не первый раз так делают.

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

Как там на ANSI C с отсутствием однострочных комментариев? Или без flexible array member? Designated initializers? Не говоря уже о restrict и inline.

Всё это не нужно. Свистоперделки в чистом виде.

vbr ★★★★
()

Если исходить из частоты использования на github. extentof побеждает с один единственным использованием в файле ncbi_socket.c, и то в другом значении.

AlexVR ★★★★★
()