LINUX.ORG.RU

Поломана совместимость с С в С++11?

 


2

2
cat test.cpp 
#include <stdio.h>

int main(int argc, char** argv)
{
	auto int i = 2;
	printf("Hello!\n");
	return 0;
}
 gcc test.cpp.
/a.out
Hello!
 g++ test.cpp
 ./a.out 
Hello!
 g++ --std=c++11 test.cpp 
test.cpp: В функции «int main(int, char**)»:
test.cpp:5:11: ошибка: два или более типа в декларации имени «i»

Ваши мнения по этому поводу.

Ответ на: комментарий от imtw

С векторами или комплексными числами там можно работать?

Пользователя это не волнует :) Но с комплексными числами можно.

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

Я вам сочувствую, вы работали с идиотами(ну или как вариант идиот был один - тимлид). В нормальных проектах(на любых языках) в самом начале составляется стандарт(ы) кодирования/стиля, где регламентируются подобные вопросы. Любой новый человек в команде отправляется первым делом туда. Меняется это все крайне редко, часто в совещательном(конструктивном) порядке.

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

Это фраза ни о чем. Так и на брейнфаке писать можно. А чо, по вашей логике(чем меньше возможностей, тем язык проще) он проще Си.

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

Но с комплексными числами можно.

Т.е. там можно написать что-то вроде a+b*c?

Пользователя это не волнует

Думаете он не почувствует, что софт для него писали убогонькие, которые даже основы C++ не смогли осилить?

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

с комплексными числами можно.

Т.е. там можно написать что-то вроде a+b*c?

Да. В C99 есть _Complex.

Пользователя это не волнует

Думаете он не почувствует

Вот честно - мне пофиг, что он почувствует. Я иронизировал над тем, что в этом треде вообще появилось упоминание волнений пользователей.

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

Тогда объясните, по какой логике С проще С++

Си почти подмножество Си++.

Разве не про возможности вы говорили?

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

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

С векторами или комплексными числами там можно работать?

А в чем проблема? Или у векторов и комплексных чисел какие-то байты свои, объектно-ориентированные? Если это типа подколка по поводу перегрузки операторов - ну, возможно ее иногда и не хватает

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

Подмножество. Но в С++ это подмножество в чистом виде почти не используется. Т.е. я не буду, например, использовать сырые указатели и мучиться с ручным расставлением освобождения памяти(и других ресурсов). Есть более удобные средства, работающие столь же быстро, как и ручная реализация. И вот для меня это означает, что С++ проще(в хорошем смысле этого слова) С. И на нем легче разрабатывать сложные системы. Но меня при этом не лишают возможности опуститься ниже(например, если я решу использовать более оптимальные в моем случае механизмы аллокации памяти и пр.), при чем таким образом, что высокоуровневый код не пострадает в своей лаконичности и ясности.

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

Есть более удобные средства, работающие столь же быстро, как и ручная реализация. И вот для меня это означает, что С++ проще(в хорошем смысле этого слова) С

Но меня при этом не лишают возможности опуститься ниже(например, если я решу использовать более оптимальные в моем случае механизмы аллокации памяти и пр.)

Теперь сложим это вместе и... получим больше сложности, чем есть в Си.

Анон, давай ты выскажешь свою мысль коротко. Я думаю, что наши мнения насчет Си и Си++ довольно близки. Вот, например, я считаю, что Си безнадежно устарел, а его стандарт разрабатывают агрессивные обскуранты (достаточно посмотреть на формулировку, с которой отвергли typeof, и на _Generic). Си++, при всей его головоломной сложности, является более современным и выразительным языком, он развивается (в отличие от Си), и развивается в разумном напрвлении.

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

Тогда что, кроме религии, вам мешает взять С++, писать(пока) в С стиле, но иногда использовать полезные для вас фичи? Постепенно, вы увидите пользу и других фич, научитесь ими пользоваться и получите профит. За уши никто не тянет пускаться во все тяжкие. Вы ничего не потеряете. Ровным счетом ничего. И никакого геморра не приобретете, поскольку будете использовать только то, что вам нужно.

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

слились на ООП, подсчете ссылок и пр

В С же нет ООП? Есть имитация, договоренности, но когда С придумывали никакого ООП не было. А ссылки пусть валгринд подсчитывает. Непонятно что тут сливать, если этого нет, значит нет. Да я же не об этом. А о том что полезность этого всего ООП, шаблонного метапрограммирования для многих задач сомнительная. Пока гениальный С++-ник будет героически биться с бустом, обычный С-шник не обремененный этими знаниями возьмет и сделает

И опять толдычите как мантру «практика показывает...»

Талдычим. Так ведь показывает же, что нам, молчать?

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

Давай. Схожи, да. Но я еще добавлю, что конкурента достойного у С++ сейчас нет.

А вот на счет сложности - не могу согласиться. Сложность языка программирования, на мой взгляд, определяется тем, насколько сложно он позволяет решать те задачи, для которых предназначен. А то, о чем говоришь ты, я бы сформулировал как «С ущербнее С++».

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

конкурента достойного у С++ сейчас нет.

Согласен. И это одновременно удивительно и печально. Да еще Rust несет куда-то не туда :/

то, о чем говоришь ты, я бы сформулировал как «С ущербнее С++».

Я бы не сказал. За 30 лет эволюции Си++ стал монстром. С учетом опыта Си++ (и не только его, конечно) можно было бы добавить к Си относительно консервативные расширения, которые сделали бы его гораздо «неущербнее». Но... психология ЦА мешает этому.

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

Были заявления, что ООП в си делается нормально, что в контексте разговора о С и С++ было воспринято как сравнение.

Подсчета ссылок в С++ тоже нет. Но его можно реализовать. В С тоже(есть в gobject, например). Сравнивались реализации. В С++ это будет выглядеть как замена my_type * на, допустим, shared_ptr<my_type>(и weak_ptr<my_type>). И все. Явное удаление больше не требуется, а с умными указателями работаем так же, как и с обычными. В С же мы заменяем my_type_t * на gpointer'ы, руками расставляем кучу всяких g_object_ref, g_object_unref, g_object_add_weak_pointer, g_object_remove_weak_pointer, g_object_weak_ref, g_object_weak_unref и пр. И, самое главное, что это не избавляет нас ни от ручной работы, ни от утечек, т.к. забыть g_object_unref не сложнее, чем забыть какой-нибудь явный free. Т.е. почти не дает профита, а может даже запутывает код еще больше. Ну и что проще, С или С++?

Теперь объясни мне, зачем бороться с бустом? Если тебе оттуда что-то нужно - возьми. Не нужно/не можешь разобраться - не бери. Так даже к стандартной библиотеке относиться можно, не то что к сторонним, вроде буста.

«Практика показывает» - это или ваше восприятие или убогая практика(ваше же). Ну или просто банальная ложь. Подкрепить свои слова вы не можете. Или я не прав?

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

typeof и ({ - в GCC, scope - в D, лямбды - везде, простой вариант наследования (только struct, без членов) - в Си++ образца 1985 года; возврат нескольких значений из функции - это тот же возврат структуры.

интересного

Весь пойнт в том, что это уже не интересно :)

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

Ну и что проще, С или С++?

С проще. Считать ссылки (на аллоцированные самой программой куски памяти же, да?) нужно только в очень специальных случаях. С утечками прекрасно справляется валгринд

Подкрепить свои слова вы не можете

Вот фраза полностью: «Практика показывает что наиболее производительно и предсказуемо программировать получается на простых языках». Что и как тут нужно подкреплять? Это же банальность. «Практика показывает что лучше быть здоровым и богатым чем бедным и больным». Большинство больших сложных проектов - это С или С++ с минимумом «фич». Юниксы, Линукс, Виндовс, куча разнокалиберных библиотек и остального софта. Да вон же в новостях Кармак только сейчас задумался об использовании STL.

Вот ссылка на Тиобе http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html , С++ там на 4-м месте, С мечется между 1-м и 2-м

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

При чем тут валгринд? Как он избавит меня от геморра с ручным освобождением памяти, который чреват ошибками, отнимает время и тупо СЛОЖНЕЕ? Да, он позволит потом устранить баги, но разработку он не упростит.

По поводу практики - вы не продемонстрировали и не доказали то, что С проще С++. На нем сложнее создавать сложные системы, чем С++ из-за ущербности возможностей С по управлению этой самой сложностью.

По поводу тиобе - почитайте, как они формируют рейтинг. Тяжело понять, какую долю рейтинга С занимает на самом деле С++(может и малую - я не берусь судить).

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

геморра с ручным освобождением памяти, который чреват ошибками

Для С есть сборщик мусора: https://github.com/ivmai/bdwgc/ , если уж управление памятью кажется таким сложным делом. Как правило ручное управление памятью (и остальными ресурсами) вообще не вызывает никаких проблем. Основные проблемы в программировании - это проблемы предметной области.

По поводу практики - вы не продемонстрировали и не доказали то, что С проще С++. На нем сложнее создавать сложные системы

Так практика это и есть ядро Линукс и прочий софт на С, который создавался уже при живом С++ и так и не перешел на него. Я, кстати, совершенно ничего не имею против С++ и писателей на нем, пусть расцветают все цветы. Но это же типа факт: на освоение инструмента уходит очень много ресурсов, которые можно было бы потратить на предметную область. И результат может получиться совершенно неоднозначный.

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

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

Весь фан

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

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

если у тебя есть мозг и инженерный талант.

Именно это я и сказал. «Хорош для зеленых человечков». Объем и сложность языка ставит непозволительно высокую планку освоения для хорошего кода. А все, что ниже этой планки - УЖАС-УЖАС-УЖАС.

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

достаточно посмотреть на формулировку, с которой отвергли typeof

А где это можно посмотреть?

«Not enough utility», Просто поверь stackoverflow :)

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

Я этот сборщик и для С++ использовал. Но если вы не понимаете, в чем заключаются преимущества и недостатки подсчета ссылок по сравнению с полноценной сборкой мусора, то я не смогу вам помочь... Они решают разные задачи.

И даже без подсчета ссылок в С++ мне не нужно явно вызывать освобождение ресурса(памяти, файлов, мьютексов и т.д.). Это называется RAII. Но си не дает даже такой мелочи.

Я не знаю, каким надо быть идиотом, чтобы на освоения С++ тратилось много времени. Честно. Особенно после С. Вот не-сишникам может быть тяжело, да.

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

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

На си такой код написать сложнее, чем на плюсах.

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

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

И я услышу в этой теме конкретику? Примеры?

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

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

Читабельность кода, например. Можно привести классический пример из «The Dark Side of C++»:

baz = foo->bar(3);
В С все просто и понятно, в С++ эта запись может означать все что угодно.

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

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

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

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

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

Мы понимаем, не надо нам помогать, спасибо

даже без подсчета ссылок в С++ мне не нужно явно вызывать освобождение ресурса(памяти, файлов, мьютексов и т.д.). Это называется RAII

Только для этого нужно же написать конструктор-деструктор? А для С обычная «RAII» практика - if и goto (две строчки кода)

Я не знаю, каким надо быть идиотом, чтобы на освоения С++ тратилось много времени

OMG

Кстати, есть же прекрасная иллюстрация: http://www.gnu.org/fun/jokes/helloworld.html

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

Только для этого нужно же написать конструктор-деструктор? А для С обычная «RAII» практика - if и goto (две строчки кода)

это не две строчки кода, это много строчек кода в самых разных местах проекта, посмотри на ohloh сколько людей в скольких проектах дергает один только g_string_free, а это только одна реализация одного «класса»

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

if и goto - это не RAII практика. Даже finally во всяких жабках лучше(впрочем и там от него отказываются в пользу RAII, пусть и ущербного).

Подсчет ссылок - хорошая иллюстрация(спасибо анону). Там где в С++ вообще нет строчек, тебе придется страдать рукоблудием. На ровном месте. Но ты конечно же будешь считать, что так проще...

Что тебя удивляет в плане сложности изучения? С++ не сложнее явы(особенно какой-нибудь 8ой), шарпа или там скалки. Просто требует больших ОБЩИХ знаний. У человека, знающего принципы ООП, алгоритмы, архитектуру вычислительных систем, умеющего работать с документацией и пр. НИКАКИХ проблем не будет при написании С++ программ. Что там сложного(тут уже просили пример)?

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

НИКАКИХ проблем не будет при написании С++ программ

написании

Вот именно. Поддерживать плюсовый код - сомнительное удовольствие.

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

Вы же не пробовали, чего говорите.

Если писали не идиоты, то все нормально и в плане поддержки. А вообще очередная мантра. Анон прав.

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

ОМГ. Хватит фантазировать и оправдывать свою лень всякой херней. Хватит рукоблудить - начните уже программировать.

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

при условии, что он попадет в нормальную команду.

Ага. А потом сделаем определение «нормальная команда - это такая команда, в которой любой станет писать нормальный код через неделю».

Конкретику я уже давал выше.

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

Напомни, что была за конкретика.

«Нормальная команда» - это команда профессиональных разработчиков, которые среди прочего(!) знают С++ и обладают достаточными возможностями для помощи новому человеку. Если допустим он писал на шарпе/яве или, наоборот, на си и при этом хороший программист и знает свое дело - никаких проблем не возникнет.

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

Конкретики - полный интернет. Только вы плюсисты это все заносите в категорию «не осилил» (или «никто не заставляет этим пользоваться»). Но этого «не осилил» так много, что я это заношу в отрицательные свойства именно языка. И «не заставляет» для новичков означает, что надо обязательно иметь реального гуру, который некоторое время будет бить по рукам на всех местах, где «не трогай каку».
Осилить С++ легко зеленым большеголовым человечкам. А если говорить о людях, до качественного освоения - именно как говорит Страуструп, прострел ноги чреват полной ампутации.

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

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

C++ не подходит для первого языка(на данный момент времени), но для профессионального программиста не представляет опасности. Гуру желателен, да. Но не для того, чтобы бить по рукам, а для демонстрации правильных путей и идиом. При отсутствии такового достаточно книг/статей/выступлений Страуструпа/Мейерса/Саттера/Александреску(с ним осторожнее).

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

Похоже, это некоторое недопонимание того, как программируют на С. Как правило у разработчика есть: функции, макросы (стандартный препроцессор) и внешние инструменты - препроцессоры и генераторы кода.

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

Перегрузка операторов - это такой компромисс, попытка написать С++-ным синтаксисом похоже на математическую запись. Причем, получается не очень наглядно для математика (как, например, перегрузить оператор | чтобы он стал скобкой взятия модуля?) и сложно для разработчика (какой процент программистов на С++ смогут сделать так чтоб «a = b + c» не копировало в стек «b + c»?)

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

Можем сравнить на любой задаче.

Да доставайте уже свою задачу, не стесняйтесь. Вам уже сказали: ядро (и основная часть юзерспейса) линукса, БЗД, основная масса виндовс (там формально С++, но практически это С, если не хуже), СУБД, да чуть ли не весь опен-сорц - это все написано на С.

На С++ в голову приходит разве что фаерфокс (кстати, сильно ему помогает подсчет ссылок?), опенсорсные оффисы и браузеры, Qt + разработки с его помощью. Можно, наверное, как-то посравнивать, но как? Если у вас есть какой-то формальный параметр (а не только осознание своего интеллектуального превосходства) по которому можно сравнить - почему бы и нет?

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

Ну сравни. Жирный, разваливающийся под собственным весом монстр gcc и компактный, простой как грабли llvm+clang.

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

Жирный, разваливающийся под собственным весом монстр gcc и компактный, простой как грабли llvm+clang.

У тебя они оба на диске? Давай sloccount.

P.S. называть llvm и clang «простыми, как грабли» - дешевые понты.

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

ядро (и основная часть юзерспейса) линукса, БЗД

на момент их создания плюсы были в зайчаточном состоянии или их вообще не было, из новых ядер - Haiku на плюсах

основная масса виндовс (там формально С++

значит С++

СУБД

MySQL большей частью на С++:

http://www.ohloh.net/p/mysql

еще есть всякие mongodb, drizzle, mariadb и пр., да - postgres, например, на С, но у него очень старая кодовая база

да чуть ли не весь опен-сорц - это все написано на С.

голословное утверждение, ведь можно проверить:

http://www.ohloh.net/languages

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

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

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