Thu, 7 Apr 2005 06:08:01 +0000 (UTC) Andrey Solomatov wrote to Harry Zhurov:
AS>>> Угу. Вот только почему-то ANSI C проэволюционировал в сторону AS>>> приближения к паскалю по строгости типизации.
HZ>> С какого фига к паскалю-то? К С++!
AS> А C++ на пустом месте рождался?
Нет, С++ рождался не на пустом месте, как и почти любой ЯП. Конкретно, С++ рождался на основе С и Симулы.
AS> Да и мало он был распространён на момент стандартизации.
Стандартизации чего? С? Или С++?
AS>>> Может быть вернёмся к C&R C?
HZ>> А это что?
AS> Керниган и Ритчи. Авторы, вообще-то, "исходного" языка C.
Тогда надо было писать K&R.
AS> Скажем, обявление функции: AS> func() AS> int a; AS> char *c; AS> { AS> } /* это по ихнему */
Это смотря по какому изданию. По 2-му там такого уже нет, уже ANSI вовсю рулит. А до ансишного варианта там вообще было эн диалектов, каждый из которых отличался в мелочах от других, что рубило под корень переносимость. И только после принятия Стандарта через некоторое время навелся порядок. Тогда было модно в первой же строчке проспекта на компилятор сообщать, что, дескать, у нас fully ANSI C compatible - типа, это неоспоримое преимущество. :)
HZ>> Причем тут это? маллоки и прочее - это работа со свободной памятью, HZ>> которая имеет отношение к менеджерам памяти и подобному. А прямое HZ>> обращение к памяти - это прямое обращение к памяти. Или ты не знаешь HZ>> как это делается?
AS> Нет, не знаю. Расскажи.
Стебаешься? Или правда не знаешь?
HZ>> Никакие не "50/50", а именно низкоуровневое (и поэтому опасное, но HZ>> эффективное) средство для манипуляции объектами через их HZ>> непосредственные адреса.
AS> Вот только мне, почему-то, за ~15 лет понадобилось пару-тройку раз. AS> Причём - исключительно в силу "грязности" алгоритма, потом я AS> "это" безжалостно выкинул.
Это потому, что ты на паскале писал. И на РС. А когда на МК подсядешь, так сразу поймешь, в чем "сермяжная правда жизни". :)
HZ>> Сколько программ на С++ ты написал? Сколько строк кода (хотя бы HZ>> очень приблизительно) на С++ ты написал?
AS> Мало, мало, успокойся.
А я спокоен. Хотелось просто узнать, на каком реально опыте основаны те смелые высказывания. :)
AS> Штуки 3 - 4 -5 (если "до конца"). AS> Ты всерьёз хочешь меня уверить, что в C++ легко "выйти за границы"?
"Как два байта переслать" (с)! С++ никого насильно не держит - хочешь нарушить контроль типов - нарушай (через явное преобразование), прога скомпилится без проблем. А вот будет ли работать - это вопрос. При таких действиях программиста ответственность за последствия перекладывается на последнего, но язык не _заставляет_ что-то делать и не вводит непреодолимых ограничений. Другими словами, в нем есть защита от "дурака", но не защита от злонамеренного взлома. Хочешь ломать - ломай, в С++ это так же просто, как и в С.
AS>>> А чем ты предлагаешь пользоваться? AS>>> Переписывать каждый раз все определение типа?
HZ>> ??? А про typedef ты ничего не слышал?
AS> Не люблю typedef.
? А он не девушка, чтоб его любить. Он есть средство для достижения определенной цели. Вполне удобное. И не пользоваться им к месту просто, мягко говоря, неразумно.
AS> Лишняя прибамбасина,
Очень полезная "прибамбасина", позволяет вводить удобные синонимы для типов.
AS> с достаточно невнятным синтаксисом.
Синтаксис у него - проще не придумаешь!
AS> И вообще, если я в C++ пишу:
AS> struct TAbc AS> { AS> // AS> // Здесь дли-иинное определение структуры AS> // AS> }; /* TAbc */
AS> то здесь достаточно ясно и понятно. И typedef не нужен AS> (бо никакой функциональности не несёт).
Здесь не нужен (в С++), но есть места, где нужен.
AS> В C же надо писать:
AS> struct AS> { AS> // AS> // Здесь дли-иинное определение структуры AS> // AS> }TAbc;
Это ты не тип определил, а объект объявил. Нету тут типа. А если написать:
typedef struct TAbc { // // Здесь дли-иинное определение структуры // } TAbc;
то это и будет определение типа. Всего на одно слово длиннее, чем в С++.
AS> Что, во первых, хуже читается - разделено имя типа и его описание; AS> во вторых - тот самый struct; и в третьих - если не охота юзать struct - AS> надо засовывать ещё невнятный typedef.
Ерунда. После определенного с помощью typedef'а просто пишешь:
TAbs Abs;
и все. Почти, как в С++.
AS> Ну его, C++ лучшее. ;))
Да, в С++ лучше, но это _мелочи_.
HZ>> Кстати, какие вещи из С не компилируются в С++?
AS> Ну и плюс - перегрузка.
Причем тут перегрузка? Вопрос был про С программы. Откуда там перегрузка?
AS> Фактически при этом явного выхода за пределы С не происходит - просто AS> делаешь набор get, отличающийся перечнем аргументов.
Ниче не понял! Что такое "набор get"?
AS> [кусь]
HZ>> И на какую платформу ты перешел в ++?
AS> А я и тогда - и до, и после - сидел на писюке. AS> А сейчас перешёл на эмбедды - и тихо матерюсь от реализаций
Вот я и спросил, на какую платформу в ембеддах ты перешел?
AS> C на них (кто там дифирамбы поет "стандартности C")? AS> ---------------- AS> Пишем: AS> func() AS> { AS> ...
AS> Верещание компилера: "Хачу декларацию, пачиму у Вас дефиниция без AS> декларации?" AS> --------------- AS> Добавляю: AS> func(); AS> func() AS> { AS> ...
AS> Визги: "Какая-то непонятная декларация. Как Вы посмели переопределить тип AS> функции func?"
AS> -------------- AS> Оказывается надо: AS> func(void); AS> func() AS> { AS> ...
AS> Тьфу... Кто бы мог подумать...
Ерунда какая-то. Под какую платформу? Какой компилятор?