Просьба не читать профессиональным Си/ С++ программистам).
В статье я выражаю свою точку зрения, если несогласны — обоснуйте в комментариях.
Цель данной статьи: указать на недостатки С и С++, которые мне очень не нравятся и побудить Вас использовать новую версию языка или возможно даже предложить какие-то идеи по улучшению стандарта.
Что ж, самое время разжечь холивар.
Я думаю все в курсе, что в курсе что в C++ ужасные строки. Особенно, если мы говорим о старом типе, в новом string многое было исправлено и улучшено, но до сих пор нет поддержки юникода(!).
В стандарте C++ 20 вроде как собираются вводить unicode строки.
С++ 20! И это несмотря на то, что С++ существует с 1983 года.
Откроем вашу любимую IDE и попробуем скомпилировать следующий код:
UPD1: комментатор говорит, что кракозябры только на винде. Это точно, забыл об этом написать.
Но все равно неприятно.
Я компилировал в Dev Cpp, компилятор GCC.
Скомпилируем и видим:
Хороший вывод на экран, да?
А теперь давайте заменим char string[256] на char* string.
Я не говорю, что это должно работать, но компилятор должен был выкинуть ошибку как максимум.
Мы получили рабочую программу, которая зависла.
Лучше бы компилятор выкинул ошибку.
Причем вся фигня в том, что компилятор мало того, что скомпилировал ее, он еще не
вывел предупреждения.
Вот еще прикол:
Что мы ожидаем? Компилятор скажет нам, что нельзя обратиться к 101 элементу массива, раз элементов всего 100. Но компилируем, запускаем и видим… 32765( по крайней мере на моем железе).
Мда.
А теперь давайте протестируем вот этот код:
Как вы думаете, что он выведет?
Правильный ответ — зависит от компилятора.
В GCC это будет 14, но в зависимости от флагов оптимизации.
А в другом компиляторе это легко может быть 12…
Думаю, все знают что в С и в плюсиках куча синтаксического сахара, который далеко не всегда нужен.
Например
Он выводит n, так же как и
Здорово, да?
А теперь о больном.
С++ и сеть.
Это 2 ооочень плохо состыкующихся понятия.
Попробуйте просто скачать изображение котика с Вашего любимого сайта с помощью стандартной библиотеки C++.
Это было невозможно до принятия стандарта С++ 17.
В той же стандартной библиотеки нельзя работать с JSON.
Отличный комментарий по этому поводу.
Думаете, условие всегда будет ложно?
Нет, Вы ошибаетесь.
Если скомпилировать это как с++ проект то условие скорее всего не выполнится.
Не должно.[1]
А если как Си проект, то в таком случае sizeof('a')==sizeof(int).
Вот такие дела.
[1] Вообще множество разных компиляторов C и C++ это тоже проблема.
Потому что множество решений нестандартизовано и они будут работать только в определенных компиляторах.
Например, 128 битные числа в C++. В gcc и clang есть тип __int128, в то время как в Visual Studio его нет, потому что он не является стандартом. Или, например, строки в Visual Studio.
Или, например, в старичке Borland C++ Builder можно код, написанный на Object Pascal.
И таких моментов много.
Особую боль вызывает отсутствие списка пакетов Си и С++.
Что из этого следует? Используйте новую версию C++, например С++ 17 и некоторые проблемы будут решены.
Надо сказать, что в ближайшем конкуренте C++ — Rust нет большинства проблем из этого списка, например есть замечательный cargo, но разумеется он тоже неидеален.
А какие проблемы С и С++ знаете Вы?
Пишите в комментариях.
UPD: похоже многие люди неправильно поняли мою статью:
У всего есть свои минусы, я просто поделился мыслями.
UPD2:
В комментариях многие пишут, что так работает ос и вообще это фичи. Ребята, вы неправы.
Тот же раст доказательство, что можно сделать язык системного программирования в котором не так просто выстрелить себе в ногу.
Просто в С/С++ полно легаси решений, которые никто не исправит, потому что это может сломать обратную совместимость.
И да, это мое мнение, оно субъективно.
Если Вы не согласны — лучше прокомментируйте, а не тупо минусуйте, потому что мнение всех нас
субъективно.
В статье я выражаю свою точку зрения, если несогласны — обоснуйте в комментариях.
Цель данной статьи: указать на недостатки С и С++, которые мне очень не нравятся и побудить Вас использовать новую версию языка или возможно даже предложить какие-то идеи по улучшению стандарта.
Что ж, самое время разжечь холивар.
Я думаю все в курсе, что в курсе что в 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:
В комментариях многие пишут, что так работает ос и вообще это фичи. Ребята, вы неправы.
Тот же раст доказательство, что можно сделать язык системного программирования в котором не так просто выстрелить себе в ногу.
Просто в С/С++ полно легаси решений, которые никто не исправит, потому что это может сломать обратную совместимость.
И да, это мое мнение, оно субъективно.
Если Вы не согласны — лучше прокомментируйте, а не тупо минусуйте, потому что мнение всех нас
субъективно.