Как стать автором
Обновить

Что мне не нравится в C и С++

Время на прочтение3 мин
Количество просмотров9.2K
Просьба не читать профессиональным Си/ С++ программистам).

В статье я выражаю свою точку зрения, если несогласны — обоснуйте в комментариях.
Цель данной статьи: указать на недостатки С и С++, которые мне очень не нравятся и побудить Вас использовать новую версию языка или возможно даже предложить какие-то идеи по улучшению стандарта.

Что ж, самое время разжечь холивар.

Я думаю все в курсе, что в курсе что в C++ ужасные строки. Особенно, если мы говорим о старом типе, в новом string многое было исправлено и улучшено, но до сих пор нет поддержки юникода(!).

В стандарте C++ 20 вроде как собираются вводить unicode строки.

С++ 20! И это несмотря на то, что С++ существует с 1983 года.

Откроем вашу любимую IDE и попробуем скомпилировать следующий код:

#include <iostream>
#include <cstdio>
 
int main()
{
  char string [256];
  std::cout << "Привет: ";
  gets(string); 
  std::cout << "Вывод: " << string;
  return 0;
}

UPD1: комментатор говорит, что кракозябры только на винде. Это точно, забыл об этом написать.
Но все равно неприятно.

Я компилировал в Dev Cpp, компилятор GCC.

Скомпилируем и видим:



Хороший вывод на экран, да?

А теперь давайте заменим char string[256] на char* string.

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

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

Вот еще прикол:

#include <iostream>
using namespace std;
int main(){
    int arr[100]={};
    cout<<arr[101]<<endl;
    return 0;
}

Что мы ожидаем? Компилятор скажет нам, что нельзя обратиться к 101 элементу массива, раз элементов всего 100. Но компилируем, запускаем и видим… 32765( по крайней мере на моем железе).

Мда.

А теперь давайте протестируем вот этот код:

int i = 5;
i = ++i + ++i;
std::cout<<i;

Как вы думаете, что он выведет?

Правильный ответ — зависит от компилятора.

В GCC это будет 14, но в зависимости от флагов оптимизации.

А в другом компиляторе это легко может быть 12…

Думаю, все знают что в С и в плюсиках куча синтаксического сахара, который далеко не всегда нужен.

Например std::cout<<4["string"]; это валидный код
Он выводит n, так же как и std::cout<<"string"[4];

Здорово, да?

А теперь о больном.
С++ и сеть.
Это 2 ооочень плохо состыкующихся понятия.
Попробуйте просто скачать изображение котика с Вашего любимого сайта с помощью стандартной библиотеки C++.
Это было невозможно до принятия стандарта С++ 17.
В той же стандартной библиотеки нельзя работать с JSON.
Отличный комментарий по этому поводу.
В целом работа с JSON в C++ сродни кошмару.
Источник.
Думаете, условие всегда будет ложно?

if(sizeof ('a') != sizeof (char)){
//do something
}

Нет, Вы ошибаетесь.

Если скомпилировать это как с++ проект то условие скорее всего не выполнится.
Не должно.[1]
А если как Си проект, то в таком случае sizeof('a')==sizeof(int).
Вот такие дела.
[1] Вообще множество разных компиляторов C и C++ это тоже проблема.
Потому что множество решений нестандартизовано и они будут работать только в определенных компиляторах.

Например, 128 битные числа в C++. В gcc и clang есть тип __int128, в то время как в Visual Studio его нет, потому что он не является стандартом. Или, например, строки в Visual Studio.

String^ MyString3 = "Hello, world!"; //попробуйте скомпилировать в GCC

Или, например, в старичке Borland C++ Builder можно код, написанный на Object Pascal.
И таких моментов много.

Особую боль вызывает отсутствие списка пакетов Си и С++.

Что из этого следует? Используйте новую версию C++, например С++ 17 и некоторые проблемы будут решены.

Надо сказать, что в ближайшем конкуренте C++ — Rust нет большинства проблем из этого списка, например есть замечательный cargo, но разумеется он тоже неидеален.

А какие проблемы С и С++ знаете Вы?
Пишите в комментариях.

UPD: похоже многие люди неправильно поняли мою статью:
Я ни в коем случаи не хочу раскритиковать си/с++ и сказать пишите на расте.
Просто указываю на недостатки с/с++, т.к они немного достали самого.

У всего есть свои минусы, я просто поделился мыслями.
UPD2:

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

Просто в С/С++ полно легаси решений, которые никто не исправит, потому что это может сломать обратную совместимость.

И да, это мое мнение, оно субъективно.

Если Вы не согласны — лучше прокомментируйте, а не тупо минусуйте, потому что мнение всех нас
субъективно.
Теги:
Хабы:
Всего голосов 78: ↑13 и ↓65-52
Комментарии119

Публикации

Истории

Работа

Rust разработчик
10 вакансий
Программист C++
133 вакансии
Программист С
46 вакансий
QT разработчик
8 вакансий

Ближайшие события