LINUX.ORG.RU
ФорумTalks

Опрос: Три-пять лучших фич C++

 , ,


3

4

Поскольку я с недавних пор устроился на работу, то простыни временно закончились. Тем не менее, каждый раз при работе с сишным кодом снова и снова всплывает мысль «блин, как же здесь не фатает крестов». Но в остальном сишки мне более чем хватает, мне не нужны геттеры-сеттеры, классы-интерфейсы под single responsibility, и прочая мура. Пару источников вдохновения:

https://google.github.io/styleguide/cppguide.html
https://yosefk.com/c fqa/

Итак, назовите от трех до пяти фич крестов, которые бы вы взяли с собой на необитаемый остров Си. Можно несуществующие или из будущих стандартов. А я чуть позже назову те, которые взял бы я. (назвал)

И да, я в курсе, что где-то год назад ведьмак создавал тред на схожую тему, но мое знание крестов с тех пор выросло настолько, что меня чуть не взяли работать крестовиком. Так что теперь тред вести буду я. Как обычно, «для себя из прошлого», чтоб гештальты позакрывать.

Итоги по состоянию на 24.12.2021 22:00 (MSK): https://pastebin.com/bxamaGDY

★★★★

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

Лучшее что есть в крестах это написанный на них v8

Аналогично для сишки - питон

Все остальное в С-подобных ад и уныние

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

Понять и простить. Я упомянул очень простые штуки, в том числе на основе которых можно писать составные контейнеры, и уж при самом-самом крайнем случае писать что-то по-настоящему свое. Без строк в 2021 очень неприятно писать программы, знаешь ли.

Не. Я реально не знаю, как там в Go с этим. Если знаешь, просвяти. Можно ли там иметь свой тип контейнера со своим типом элементов или хотя бы стандартный контейнер с пользовательским типом элементов и засовывать его в стандартные алгоритмы?

Да, JS и Go, индустрия своё слово сказала.

По поводу JS еще куда ни шло (хотя это в основном фронт в вебе - а это еще далеко не вся индустрия). Но по поводу Go - хрен с два индустрия показала. А если бы гугл не пиарил его, то вообще бы он помер бы уже.

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

Ой, да конечно, ты все проекты перечислил.

rumgot ★★★★★
()

Три не знаю, но перегрузки функций очень нехватает мне, а да еще const & в прототипе функции

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

перегрузки функций очень нехватает мне

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int addi(int a, int b) {
    return a + b;
}

// achtung! beware of memory leak 
char *adds(char *a, char *b) {
    char *res = malloc(strlen(a) + strlen(b) + 1);
    strcpy(res, a);
    strcat(res, b);
    return res;
}

#define add(a, b) _Generic(a, int: addi, char*: adds)(a, b)

int main(void) {
    int a = 1, b = 2;
    printf("%d\n", add(a, b)); // 3

    char *c = "hello ", *d = "world";
    printf("%s\n", add(c, d)); // hello world

    return 0;
}

ну и в clang есть attribute((overloadable))

olelookoe ★★★
()

В сишке не хватает разве что использования строк и строковых констант в case, а так всё именно так как и должно быть.

Кроме того, никто же не зарпещает использовать c++ как просто c с классами. Версию постарше указать -std=c++98 и вперёд.

Stanson ★★★★★
()
  • Классы
  • Умеренно наследование (или хотя бы возможности реализации интерфейсов)
  • Немного шаблонов и вывод типов
  • Стандартных контейнеров, особенно строк и векторов
  • RAII
  • namespace
  • references
  • move

Список не отсортирован по важности и вообще никак.

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

Вижлстудия кресты лучше поддерживает, чем си.

Можешь оставлять свои багрепорты тут: https://developercommunity.visualstudio.com/home

Visual Studio 2019/2022 заявляют о поддержке последнего актуального стандарта C17.

fsb4000 ★★★★★
()

constexpr, модули, перегрузка операторов, шаблоны, RAII

fsb4000 ★★★★★
()

Шаблоны, константные выражения, семантику перемещения и исключения (для этого правда нужен будет какой-то интерфейс для RAII, а это ещё половину всего C++ потянет).

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

шаблоны

Забавно, что создатели Go не разделили твою позицию.

До сих пор думаешь, что шаблоны в Go не добавят?

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

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

  • пишется программа(ы), которая эти значения вычисляет. большая, маленькая, несколько маленьких - неважно.
  • результаты вычислений заносятся этими программой(ами) в (обычно) .h файл
  • компилируем основную программу

общая идея такова. ну и все эти действия выполняются на этапе сборки целевого приложения.

olelookoe ★★★
()
  1. Пользовательская база
  2. Популярность
  3. Живучесть

У C всего этого тоже в достатке, но главное в том, чтобы отобрать это у крестов.

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

результаты вычислений заносятся этими программой(ами) в (обычно) .h файл

Вот единственное, чего не хватает сишечке в стандарте - вменяемая компоновка с бинарниками.

Но этого и в крестах нет, так что.

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

общая идея такова. ну и все эти действия выполняются на этапе сборки целевого приложения.

Так и «шаблоны» можно делать на С.

Хороший метод. Я тоже так делаю в С.

Да и в С++ этот метод тоже пока нужен кое-где.

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

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

Кто и как эту шустрость измерял?

Я сначала 10 лет сидел на KDE, теперь 10 лет сижу на гноме. Разницу я можно сказать жопой своей прочуял. Очевидно, прав я.

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

Интересно. И вот только напрашивается вопрос. Ты 10 лет сидел на каких именно версиях кед и на каком железе? И далее ты еще 10 лет сидишь на каких версиях гнома и каком железе?

Это я к тому, что разве есть принципиальная разница в количестве лет, проведенных на конкретном графическом окружении, ведь это были разные версии и разное железо.

От себя скажу так. По мне текущие kde, cinnamon, mate на моем железе i7-7700/16Gb/SSD работают примерно одинаково быстро. Если взять мой десятилетний ноут i7-3520M/8Gb/HDD, то на нем указанные окружения работают относительно одинаково стабильно с периодическими подтормаживаниями.

rumgot ★★★★★
()

Я бы выкинул из сишки массивы и оставил бы только указатели, массивы мешают видить всю гибкость и мощь работы с указателями

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

Так и «шаблоны» можно делать на С.

да, это проще и приятней чем на макросах колхозить.

и да, с выхлопом кодогенератора обычно хлопот меньше, согласен.

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

ну хорошо, тогда пусть удалят синтаксический сахар над указателями, который позволяет разыменовывать указатель каким-то неестественным образом pointer[i]

IvanR ★★★
()

1. Деструкторы
2. Шаблоны
3. Функторы и Лямбды

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 2)

Лямбды.

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

в Си будет кучу раз продублировано

Либо будет решено на уровне макросов.
Слез, боли, ужаса и макросов.

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

ну такой себе вброс, кажется у них это даже в документации написано.

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

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

abcq ★★
()
Ответ на: комментарий от i-rinat

Если в Си добавить классы, то нужно ещё добавлять и исключения

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

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

Говорят, что плохо отвечать вопросом на вопрос. Поэтому я отвечу тремя вопросами. Про три вопроса ничего плохого я не слышал.

  1. Как вернуть ошибку из конструктора без использования исключений?
  2. Пробовал ли ты писать на Си++ без исключений?
  3. А без стандартной библиотеки?
i-rinat ★★★★★
()
Ответ на: комментарий от trex6

Не ссорьтесь. Я сразу подчеркнул, что класс — это слишком абстрактная штука, чтобы о чем-то говорить. Ваша ветка обсуждения началась с того, что «defer заменяется классом с деструктором» — то есть, приплели классы «потому что». Внезапно Ринат приплел сюда еще и конструкторы, которым, очевидно, нужны исключения, потому что у конструкторов нет возвращаемого значения. Однако, исключения не нужны классами без конструкторов.

Более того, исключения в деструкторах вообще не прокатывают, потому что при исключении в деструкторе программа валится. К слову о замечательной архитектуре классов C++.

byko3y ★★★★
() автор топика

Пащитал голоса: https://pastebin.com/vNHgJxJ1

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

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

дописываем язык собственными руками, расставляем подпорки вручную

все приведенные тут примеры это голимый стандарт.

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

эта пара строк? переиспользована? это демонстрационный код, который показывает как решать проблему. если она вообще есть.

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

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

abcq ★★
()
Ответ на: комментарий от deep-purple

в целом, вопрос же был за «изкоробки».

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

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

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

тулчейн-то ты тут где узрел

бойлерплейт кода для того чтобы преодолеть невыразительность языка

напиши то же самое на выразительном языке, а мы почитаем

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

Если вы начнете на каждый чих писать под проекты ваше ПО которое будет генерировать определенным образом хедеры и вообще код в помощь к основной функциональности языка, как пример можно взять мок из qt и это уже даже не С. То о каком отсутствии необходимости написания дополнительного тулчейна вы говорите? Бойлерплейт вы уже показали, вам основательно возразили, что по функциональности он недотягивает до того, что реализовано как фича языков более позднего разлива. Как видите даже писать ничего не надо, я вполне способен объяснить словами, то что вы и так прекрасно поняли с первого раза, но будете продолжать защищать написание бойлерплейта, и встраивание костылей и доп оснастки для получения желаемого результата с использованием языка семидесятилетней давности даже там где в этом нет какой-то необходимости. Идеальных языков конечно нет, но зачем упираться когда есть вариант попроще и получше, без каких-либо серьезных потерь в производительности - непонятно.

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