LINUX.ORG.RU

C != C++


0

0

http://david.tribble.com/text/cdiffs.htm

Сравнение Си и Цпп. Примечательно, что Си содержит массу фич, не поддерживаемых C++, например

C99 supports variable-length arrays, which are arrays of automatic storage whose size is determined dynamically at program execution time. For example:

size_t sum(int sz)
{
float arr[sz]; // VLA, dynamically allocated

while (sz-- > 0)
arr[sz] = sz;
return sizeof(arr); // Evaluated at runtime
}

C++ does not support VLAs.

Надеюсь красноглазые фанаты уяснят наконец, что это разные языки. С++ - не улучшеный Си.

★★

C99 allows literals having types other than primitive types (e.g., user-defined structure or array types) to be specified in constant expressions; these are called compound literals. For example:

struct info
{
char name[8+1];
int type;
};

extern void add(struct info s);
extern void move(float coord[2]);

void predef(void)
{
add((struct info){ "e", 0 }); // A struct literal
move((float[2]){ +0.5, -2.7 }); // An array literal
}

C++ does not support this feature.

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

C99 introduces the feature of designated initializers, which allows specific members of structures, unions, or arrays to be initialized explicitly by name or subscript. For example:

struct info
{
char name[8+1];
int sz;
int typ;
};

struct info arr[] =
{
[0] = { .sz = 20, .name = "abc" },
[9] = { .sz = -1, .name = "" }
};

Unspecified members are default-initialized.

C++ does not support this feature.

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

мнда, давайте теперь создадим ещё несколько топиков с прописными истинами a la "бога нет", "вода мокрая", "люди умирают", etc.

asgard
()

C++ 98 года не поддерживает фичи C 99 года. Отлично!

Вот только в gcc всё это поддерживается и работает без проблем. Странно да? И в C++ следующего стандарта всё это будет поддерживаться.

Так что С++ это С плюс объекты плюс шаблоны + стандартная библиотека.

anonymous
()

>С++ - не улучшеный Си.

Также, как C99 != Си ;)

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

>трудночитаемость

Довели бы до уровня Перла - хотябы понтово было бы. А так - дерьмо дерьмом, как всегда.

anonymous
()

size_t sum(int sz) { float arr[sz]; // VLA, dynamically allocated

while (sz-- > 0) arr[sz] = sz; return sizeof(arr); // Evaluated at runtime }

C++ does not support VLAs.

не пишите бред

в С++ все это достигается средствами самого языка

в данном случае

std::vector<float> arr[sz];

while (sz-- > 0)

arr[sz] = sz;

return arr.size(); // Evaluated at runtime

acefsm
()
Ответ на: комментарий от xTERM

>C99 allows literals having types other than primitive types (e.g., user-defined structure or array types) to be specified in constant expressions; these are called compound literals. For example:

>struct info
{
char name[8+1];
int type;
};

>extern void add(struct info s);
extern void move(float coord[2]);

>void predef(void)
{
add((struct info){ "e", 0 }); // A struct literal
move((float[2]){ +0.5, -2.7 }); // An array literal
}

>C++ does not support this feature.




struct info
{
typedef char name_t [8+1];
typedef int type_t;
info(name_t _name, type_t _type)
: type(_type)
{
memcpy(name, _name, sizeof(name_t));
}
private:
char name[8+1];
int type;
};

struct vec2
{
vec2()
: x(0), y(0)
{}
vec2(float x,float y)
: x(x), y(y)
{}
vec2(const float *v)
: x(v[0]), y(v[1])
{}
vec2(const vec2 &v)
: x(v.x), y(v.y)
{}

operator float*()
{
return(float*)&x;
}
operator const float*() const
{
return(float*)&x;
}

union
{
struct
{
float x,y;
};
float v[2];
};
};


void add(info const& refInfo)
{
}

void move(vec2 const& refVec2)
{
}


add(info("e", 0));
move(vec2(0.5f, -2.7f));

acefsm
()
Ответ на: комментарий от xTERM

>Это все костыли. Как всегда.
Красноглазый бред!

anonymous
()
Ответ на: комментарий от yk4ever

>> С++ - не улучшеный Си.

> Ухудшенный.

Ну так и сказано: (not (enhanced C)) :-D

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

это не костыли, а показывает насколько язык гибок

то что вы не осилили это ваши проблемы и не стоит показывать непрофессиональность подобными суждениями

вот скажите что это еще костыль

это настоящий инструмент, реализованный средствами языка

http://boost.org/libs/spirit/index.html

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

>вот скажите что это еще костыль

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

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

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

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

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

> Для С/С++ Lex+Yacc рулят до сих пор.

Vala, кстати, так сделана.

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

>>вот скажите что это еще костыль

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

аргументируй пожалуйста или это получается что ты ничего не знаешь

где и в каких местах он кривой и чем он убогий?

про то как делается на lisp я в курсе, но от вас уж слишком пахнет незнаниями и не адекватом, лучше бы молчали и не кричали что все криво кроме lisp, видимо вы его не настолько хорошо знаете и проблемы того же lisp'a

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

>где и в каких местах он кривой и чем он убогий?

Исходники boost::spirit > 1.5МБ кривого, трудночитаемого шаблонного
говнокода. Для меня это достаточной повод считать эту поделку
недокостылём.

Для справки:

Исходники Berkley Yacc ~ 130КБ.
Исходники DSL парсера для MzScheme ~ 90КБ.
Исходники Haskell Parsec ~ 70КБ.
Всем этим, а также boost::spirit, я пользовался.

>лучше бы молчали и не кричали что все криво кроме lisp

Простите, Вы дурак? Где я такое сказал?

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

>Простите, Вы дурак? Где я такое сказал? >Посмотри, как аналогичные инструменты реализуются в Lisp, и сдохни.

>Исходники boost::spirit > 1.5МБ кривого, трудночитаемого шаблонного говнокода. Для меня это достаточной повод считать эту поделку недокостылём.

ваше мнение меня не интересует, то что для вас он трудночитаем это ваши проблемы

acefsm
()

Гм, давайте будем объективны. 1) Так или иначе, любой язык - это всего лишь инструмент для решения задач определенного класса. Язык может решать класс задач хорошо, а может не очень, и это проблема не языка, а программиста использующего язык не по назначению. 2) Возникают ситуации, когда проект состоит из различных подзадач, для решения каждой из которой не подходит один и тот же язык, т.к. разные требования. Какие существуют решения? а) Использовать разные языки/инструменты и прокидывать мосты между модулями б) Использовать язык, который лучше всего ложится в комплексе

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

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

То, что вы, уважаемые посетители ЛОРа, называете "костылями" - тот же boost::spirit, и есть примеры задач, которые В ПРИНИЦИПЕ решаются, пусть и не очень красиво на С++. Есть ситуации, когда нам на все хватает С++, бинарник генерируется эффективный, код - красивый и компактный, легко поддерживается и (вот незадача!) нету синтаксического анализатора. Мы можем прикрутить bison,lexx,yacc - бесспорно! Но не может ли так быть, что мы за****ся потом с интеграцией всего этого хозяйства в С++ код? Вполне может быть, проще заюзать boost::spirit. И так далее.. Направление мысли вы поняли, кто не понял - прочтите еще раз или подучите матчасть и более критично оцените свой опыт разработки.

Далее. С++ - отличный, мультипарадигменный, эффективный язык. У него есть слабые места - безусловно! И я их не отрицаю. Однако - откуда они все проистекают? 1) Препроцессор (наследство Си) 2) Модель разделения на хидеры и цпп файлы (наследство Си) 3) Уебищная грамматика (наследство Си) 4) Невозможность описания замыканий и анонимных вызовов (наследство Си)

Выкиньте наследство Си - и получите отличный язык, который, к слову, называется D.

А C++, как он есть - сложный, с больным наследством, и так далее - пока вне конкуренции при реализации большим проектов с жесткими требованиями на время выполнения программы/потреблением ресурсов.

zabivator
()
Ответ на: комментарий от asgard

>мнда, давайте теперь создадим ещё несколько топиков с прописными истинами a la "бога нет"

Уффф.. ну как вы уже надоели. Хочешь поговорить об этом?

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

>кривого, трудночитаемого шаблонного говнокода. Для меня ...

Для _тебя_ это слишком сложно, малыш :)

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

А чего вы ждали от _универсального_ языка? Плюс неодназначности и сложности С++, как я уже написал выше - наследство Си)

zabivator
()
Ответ на: комментарий от acefsm

>да во всем виноват С =) acefsm (*) (03.12.2007 16:36:52)

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

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

все проблемы всех продуктов это проблема обратно совместимости

это касается как языков так и ОС

вместо того чтобы делать что нить более новое и лучшее все гонятся за обратной совместимостью

acefsm
()
Ответ на: комментарий от zabivator

> 1) Препроцессор (наследство Си)

ну им как раз никто пользоваться не заставляет. не нравится - не пользуйтесь.

> 2) Модель разделения на хидеры и цпп файлы (наследство Си)

а это то чем не угодило? чисто техническая фишка. к языку как к таковому отношения не имеет.

> 3) Уебищная грамматика (наследство Си)

тут можно было бы и расширить мысль..

> 4) Невозможность описания замыканий и анонимных вызовов (наследство Си)

ммм.. а оно надо?

// wbr

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

> ну им как раз никто пользоваться не заставляет. не нравится - не пользуйтесь.

А как вы будете писать на плюсах мультиплатформенный код?

> а это то чем не угодило? чисто техническая фишка. к языку как к таковому отношения не имеет.

А как вы без препроцессора будете бороться с множественным включением хидеров? Без #if(n)def-то?

> тут можно было бы и расширить мысль..

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

> ммм.. а оно надо?

Нет, Скрипач не нужен. Темплейты-недомакросы тоже не нужны.

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

> 1) Препроцессор (наследство Си) ну им как раз никто пользоваться не заставляет. не нравится - не пользуйтесь.

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

> 2) Модель разделения на хидеры и цпп файлы (наследство Си) а это то чем не угодило? чисто техническая фишка. к языку как к таковому отношения не имеет.

Чисто техническая, но вот проблема с ADL, поиском Кенига, экспортом шаблонов, и ошибками линковки - это большой пласт проблем С++, который могло и не быть, если применить подход жава/сишарп

> 3) Уебищная грамматика (наследство Си) тут можно было бы и расширить мысль..

http://community.livejournal.com/ru_programming/864583.html?style=mine&th... - тут подробно.

> 4) Невозможность описания замыканий и анонимных вызовов (наследство Си) ммм.. а оно надо?

Как показывает практика - отсутвие closure и functional object в языке ведет к велосипедостроению и раздуванию кода. Могу примеры, если интересно

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

> А как вы будете писать на плюсах мультиплатформенный код?

hm.. вот так вот брать, руками, и писать :-? не вижу особой проблемы.

предполагается, что вся платформо-зависимая часть уже скрыта от нас низлежащим уровнем, написанном скорее всего на том-же C. если уж сравнивать C++ с кем-либо ещё и ставить их в равные условия.

> А как вы без препроцессора будете бороться с множественным включением хидеров? Без #if(n)def-то?

препроцессор? акститесь, это мантра такая, какой препроцессор. ну да, нужно в каждом .h внести теги вида #ifndef <tag> #define <tag> <body> #endif. и все. кто такой препроцессор?

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

> Синтаксис портабельного, чисто императивного ассемблера, очень сильно мешает тому, во что сейчас плюсы пытаются превратить.

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

> Нет, Скрипач не нужен. Темплейты-недомакросы тоже не нужны.

а что нужно?

// wbr

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

> предполагается, что вся платформо-зависимая часть уже скрыта от нас низлежащим уровнем, написанном скорее всего на том-же C. если уж сравнивать C++ с кем-либо ещё и ставить их в равные условия.

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

> препроцессор? акститесь, это мантра такая, какой препроцессор. ну да, нужно в каждом .h внести теги вида #ifndef <tag> #define <tag> <body> #endif. и все. кто такой препроцессор?

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

> ps: есть какие-то комментарии по поводу необходимости использования препроцессора по существу помимо тривиального включения заголовков, который действительно можно свести до уровня автомата?

А если из плюсов убрать всё, что там сейчас есть, и добавить s-expressions, то получится неплохой диалект лиспа.

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

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

> а что нужно?

Мне бы пива, пожалуйста.

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

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

Э-э-э... Вы ниасилили C++. И вы никогда в глаза не видели production cod'а ни на Си, ни на C++. Иначе вы бы не несли такого феерического бреда.

А реальность такова: большинство кода на Си пишется в объектно-ориентированном стиле. Что это значит?

Инкапсуляция: обычные struct'ы, насквозь открытые — они «скрывают» состояние классов. Функции-члены моделируются обычными функциями, получающими в качестве первого параметра указатель на такую структуру.

Наследование: дублирование в начале «класса-потомка» полей «класса-предка», возможно с помощью макросов. Небезопасные Си-стайл-касты на каждом шагу.

Полиморфизм: либо ручная эмуляция vtable, либо хранение и ручная инициализация указателей на «функции-члены».

Поэтому процитированная ваша фраза — наглая ложь. Всё, что поместится в два экрана кода на Си, займёт не больше места и на C++. Наоборот — нет, и поддерживать объектно-ориентированный код на Си *гораздо сложнее*. На вопросы, почему архитектура какой-нибудь сишной библиотеки (e. g., IJG jpeg) выглядит так уёбищно принято отвечать в духе «Of course this would all be a lot easier if we were using C++, but we are not yet prepared to assume that everyone has a C++ compiler.»

-- Qbit

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

> Поэтому процитированная ваша фраза — наглая ложь.

C - это уровень выше? Или с категориями сравнения не в порядке?

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

>Инкапсуляция: обычные struct'ы, насквозь открытые — они «скрывают» состояние классов

Садитесь, двойка. Вы ниасилили C. И вы никогда в глаза не видели production cod'а ни на С. Иначе вы бы не несли такого феерического бреда.

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

> Поэтому процитированная ваша фраза — наглая ложь. C - это уровень выше? Или с категориями сравнения не в порядке?

У вас проблемы с логикой или читаебельным аппаратом - глазами там или мозгом?

Есть ассемблер. Уровень выше - Си. Еще выше - С++.

Соотвественно - это все императивщина, только в случае Си приправленная процедурным стилем на основании которого можно эмулировать ООП стиль, а в случае С++ - императивный стиль (поддерживаемый в виде процедурного и ООП стиля) а также функциональный (в компил-тайм) дающее простор метапрограммированию.

Что непонятно с уровнями?

ЗЫ: Если какие-то слова непонятны - рекомендую почитать википедию, т.к. это азбука.

zabivator
()
Ответ на: комментарий от anonymous

>Инкапсуляция: обычные struct'ы, насквозь открытые — они «скрывают» состояние классов Садитесь, двойка. Вы ниасилили C. И вы никогда в глаза не видели production cod'а ни на С. Иначе вы бы не несли такого феерического бреда.

Дорогой анонимус, я видел production code на Си, и с мнением Qbit соглашусь, а под каждым его словом - подпишусь.

В студию примеры (в виде ссылок на продукты) являющиеся, на Ваш взгляд, образцовыми примерами production Си кода.

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

man ADT, затем поботай на тему грамотной реализации ADT на С. Какая, нахрен, "насквозь открытая структура".

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

>man ADT, затем поботай на тему грамотной реализации ADT на С. Какая, нахрен, "насквозь открытая структура".

http://www.google.ru/search?q=ADT&ie=utf-8&oe=utf-8&aq=t&rls=...

Гуглеж ничего вразумительного не дал.

Может быть, продемонстрируете или дадите ссылок?

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

Ну так у меня 4-я ссылка http://en.wikipedia.org/wiki/Abstract_data_type

Тамошняя реализация на С с использованием целочисленного дескриптора не самый удачный и не единственный вариант. Часто в качестве непрозрачного дескриптора (opaque handle) выступает указатель на структуру (содержимое которой недоступно, т.е. видно только объявление а-ля struct foo). Это является механизмом инкапсуляции, по мощности совершенно идентичным C++ pimpl idiom.

anonymous
()
Ответ на: комментарий от zabivator

> У вас проблемы с логикой или читаебельным аппаратом - глазами там или мозгом?

Дорогие мои Qbit и zabivator! Возьмите, наконец, книжку Розенталя и осильте её, если вам не понятно, что я написал. Для тех, кто не знает, кто такой Розенталь, я, так уж и быть, проведу разбор предложения: "Это когда вместо двух экранов кода на языке уровнем выше нужно две недели трахаться с проектированием и отладкой колоды классов".

Итак, в предложении сравниваются две сущности: то, в контексте чего проходит полемика, т.е. язык C++, и нечто, уровнем выше. Что же мы имеем? А имеем мы два экрана кода (стандартно по 25 строк) на том самом языке уровнем выше (как вы уже любезно напомнили, в иерархии языков C стоит выше ассемблера и ниже C++), т.е. позволяющего манипулировать более мощными абстракциями с меньшими затратами на их описание. С другой стороны, для достижения той же функциональности нам нужно потратить очень много времени для проектирования большого количества классов (т.н. "колоды") на предмете спора (языке С++), т.к. это первый шаг, к которому принуждает практика программирования на C++. Автор также обозначил, что отладка и далнейшая поддержка этих классов является более трудоёмким процессом, чем те самые два экрана код на более высокоуровневом языке.

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