LINUX.ORG.RU

Способы выстрелить себе в ногу

 ,


2

6

Раз уж сегодня день нубских вопросов... Господа, делитесь способами стрельбы себе в ногу (или сразу в голову). Начну первым: вызвать чисто виртуальную функцию. Ну и классика жанра - указатели.

★★★★★

Выставить в консольном приложении O_NONBLOCK для stdin и затем забыть убрать его перед завершением.

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

Обработка длинных строк, оканчивающихся нулём - это самое «гениальное» изобретение сишников.

Которое позволяет делать охренительные вещи вроде in-place parsing

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

Забыл добавить - не определять ее и вызвать в конструкторе наследника.

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

Я тоже так думал, но что-то видимо пошло не так

yoghurt ★★★★★
()
// std::vector<T> objects;
// std::vector<T*> pointers;

while (some_condition) {
  objects.emplace_back();
  pointers.emplace_back(&objects.back());
}
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

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

А есть какой-нибудь сайт, где все наоборот? То есть человек приводит короткий пример кода, где все умко, понятно и правильно сделано?

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

но учиться на говнокоде как-то так себе.

Читай коментарии :) Там все разжуют и обьяснят, как надо было.

А есть какой-нибудь сайт, где все наоборот? То есть человек приводит короткий пример кода, где все умко, понятно и правильно сделано?

Блоги С++, типа bfilipek, akrzemi1, alenacpp

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

Ну, если серьёзно, есть каста людей, ничего кроме C и C++ не знающих и не желающих знать.

Бьёрн Страуструп ответил достаточно ясно:

вопрос: Как вы объясняете тот факт, что C++ широко критикуется и многими программистами, но в то же время очень широко используется? Почему этот язык настолько успешен?

Бьёрн Страуструп: Ответ прост: есть только два вида языков: те, на которые жалуются все, и те, которые никто не использует.

Так что, не корректно насчёт «не знающих и не желающих знать», просто программисты на С/С++ понимают, что проблема не в языке, а в кривых ручках программиста. Высокий уровень разработчика исключает надуманные обиды на язык, но раскрывает потенциал языка С++ по созданию фантастических систем.

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

Ответ прост: есть только два вида языков: те, на которые жалуются все, и те, которые никто не использует.

Это чушь. На Си жалуются отнюдь не все, на Python тоже.

программисты на С/С++ понимают, что проблема не в языке, а в кривых ручках программиста

За всех программистов не говори.

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

Бьёрн Страуструп: Ответ прост: есть только два вида языков: те, на которые жалуются все, и те, которые никто не использует.

Да нет, можно жаловаться даже на те языки, которые никто не использует.

просто программисты на С/С++ понимают, что проблема не в языке, а в кривых ручках программиста.

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

Алсо, забавно, когда кривыми ручками программистов пытаются объяснить в том числе такие чудовищные артефакты, как препроцессор, необходимость объявления переменных и функций до их использования (привет, однопроходные компиляторы из 60х!), отсутствие модулей и прочие странные для современного языка вещи.

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

как препроцессор,

Внезапно, существует и в C#.

необходимость объявления переменных и функций до их использования (привет, однопроходные компиляторы из 60х!)

Можно ли посмотреть примеры статически-типизированных языков, где:

a) переменную можно начать использовать без объявления;

b) не требуется предварительно вводить в область видимости сущности (функции, классы и пр.), которые предстоит использовать. Т.е. языка без import-ов, use и пр. подобных конструкций.

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

Внезапно, существует и в C#.

Ага, только там ещё модули и прочие штуки есть.

Можно ли посмотреть примеры статически-типизированных языков, где

Ты, кажется, не понял. Имелось ввиду, что в C и C++ объявления должны быть обязательно выше по тексту.

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

Ты, кажется, не понял. Имелось ввиду, что в C и C++ объявления должны быть обязательно выше по тексту.

Ты, кажется, забыл уточнить «в препроцессированной единице компиляции».

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

Разве что тебе. Все остальные имеют дело с исходным кодом до препроцессирования.

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

Ага, только там ещё модули и прочие штуки есть.

Есть, но даже при этом всем часть C-шного препроцессора им пришлось оставить. В D, который почти ровесник C#, от препроцессора отказались, но сделали похожий на #if/#else/#endif version.

Ты, кажется, не понял.

Видимо, не понял.

Имелось ввиду, что в C и C++ объявления должны быть обязательно выше по тексту.

Язык C меня не интересует. Что до C++, то, например, внутри классов необязательно декларировать метод или член класса до первого обращения к нему.

Но, тем не менее, вернемся чуть-чуть назад: в каких статически-типизированных языках можно использовать переменные до их объявления?

eao197 ★★★★★
()

Тред не читал, но легко:

#define abs(x) x<0 ? -x : x

int main()
{
  return 1/((abs(1)+abs(1))-(abs(1)-abs(1)));
}
aureliano15 ★★
()
Ответ на: комментарий от hateyoufeel

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

Да уже вагон таких языков запилили. Только вот не получается у них вытеснить С и С++

Имелось ввиду, что в C и C++ объявления должны быть обязательно выше по тексту.

Это убрали еще в С99. А в С++ я лично такого не встречал даже бгг

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

в каких статически-типизированных языках можно использовать переменные до их объявления?

Rust

fn main() {
    print_hello();
}

fn print_hello() {
    println!("Hello, world!");
}

Haskell

main = putStrLn hello

hello = "Hello, world!"

Сейчас ты, конечно, придерёшься, что это не считается «до объявления», потому что они в одном модуле и в области видимости, но я именно это имел ввиду. Потому что

> cat hw.cc
#include <cstdio>

int main(void)
{
    hello();
    return 0;
}

void hello(void)
{
    puts("Hello, world!");
}
> clang++ -std=c++17 hw.cc -o hw
hw.cc:5:5: error: use of undeclared identifier 'hello'
    hello();
    ^
1 error generated.

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

Да уже вагон таких языков запилили. Только вот не получается у них вытеснить С и С++

Вытеснить C и C++ откуда? Потому что, например, из десктопного софта их уже слегка так выкинули хипсторы с электроном.

Это убрали еще в С99.

Нет, не убрали.

А в С++ я лично такого не встречал даже бгг

Ну так посмотри мой комментарий чуть выше.

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

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

Но претензии нужно предъявить C++.

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

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

Это я привёл два языка. Ты хочешь все перебрать? Всё семейство ML, Scala, в golang тоже вроде так можно. Из актуальных C и C++ так не могут.

К слову, по другим пунктам у тебя совсем нет возражений? Модули там, не? Список UB на несколько страниц?

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

Это я привёл два языка.

Где?

В Haskell-е hello — это переменная?

В Rust-е вы смогли сделать переменную только через unsafe-костыли.

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

К слову, по другим пунктам у тебя совсем нет возражений?

А вы их видели, возражения? Я вас конкретно про переменные спрашивал.

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

В Haskell-е hello — это переменная?

В Rust-е вы смогли сделать переменную только через unsafe-костыли.

Я изначально писал о функциях и прочих идентификаторах. К переменным уже ты привязался. То, что другие языки не дают городить глобальные переменные без unsafe, тут уж извини, но это фича, не баг.

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

Я изначально писал о функциях и прочих идентификаторах.

Тут все ходы записаны, памятливый вы наш:

«необходимость объявления переменных и функций до их использования»

То, что другие языки не дают городить глобальные переменные без unsafe, тут уж извини, но это фича, не баг.

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

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

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

Вытеснить C и C++ откуда? Потому что, например, из десктопного софта их уже слегка так выкинули хипсторы с электроном.

Оттуда, где критично быстродействие. А embedded вообще весь на C и крестах

Нет, не убрали

Ублюдочное условие, где переменную нельзя объявлять по месту использования давно убрали. А в твоём применён, во-первых не переменная, а во-вторых зачем это вообще надо? Это киллер-фига какая-то, юзать функции до объявления?

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

Вытеснить C и C++ откуда? Потому что, например, из десктопного софта их уже слегка так выкинули хипсторы с электроном

Это то на чём написан Slack? Который на старте жрёт 300 Мб памяти? Этот новый дивный мир! Вспоминаю тред о чудовищных современных десктопах - автора там бомбило очень правильно. Какие есть ещё популярные приложения на Электроне? На с/c++ - тысячи, например.

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

Какие есть ещё популярные приложения на Электроне?

Atom (хипстерский редактор для неосиляторов Vim/Emacs) и прочие высеры хипстеров из IT.

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

Уведомить компелятор, что собираешься использовать ниже. А вот зачем использовать до объявления - не понятно. Это даже нелогично как-то, хе хе

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

вы высказали тезис о том, что несколько фич C++ современным разработчикам объяснить будет сложно.

У меня такое чувство, что тебе либо очень нравится придираться к словам, либо ты не способен воспринимать метафоры. Я сказал, что сложно объяснить, почему в современном языке должно быть такое количество костылей из древних времён.

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

Простите, я думал, это форум о программировании. Если это и вправду форум об обмазывании говном, я, пожалуй, перестану спорить с экспертом. С другой стороны, это объясняет любовь к C++.

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

Какие есть ещё популярные приложения на Электроне?

Дохрена их, тащемта. Очень многие просто берут свой сайтик на JS, заворачивают в electron и готово.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Deleted
> cat hw.c
#include <stdio.h>

int main(void)
{
    hello();
    return 0;
}

void hello(void)
{
    puts("Hello, world!");
}
> gcc hw.c -o hw -ansi
hw.c:9:6: warning: conflicting types for 'hello'
 void hello(void)
      ^~~~~
hw.c:5:5: note: previous implicit declaration of 'hello' was here
     hello();
     ^~~~~
> gcc -v
<SKIPPED>
gcc version 7.3.0 (Gentoo 7.3.0-r1 p1.1)

Что сказать-то хотел?

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

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

Главное, уведомлять в письменной форме за три дня до использования. Желательно, уведомление высылать заказным письмом. Чтоб наверняка!

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

У меня такое чувство, что тебе либо очень нравится придираться к словам, либо ты не способен воспринимать метафоры.

Простите, я думал, это форум о программировании.

Вы уж определитесь — это форум о программировании или...

Я сказал, что сложно объяснить, почему в современном языке должно быть такое количество костылей из древних времён.

В этой фразе вообще много спекуляций, начиная с самого понятия «современный язык». Тот же C++ современен лишь потому, что сейчас он a) активно используется и b) активно развивается. Сам же по себе он старый язык и объяснять то, что в нем есть, нужно исходя из истории развития. Тогда многие вещи в нем оказываются и логичными, и понятными.

С другой стороны, это объясняет любовь к C++

C++ — это инструмент. У каждого инструмента (по крайней мере из тех, чем мне приходилось пользоваться) были и достоинства, и недостатки. Только вот в отношении C++ наблюдается явное преувеличение недостатоков и преуменьшение (а то и скрытие) достоинств. Что не есть объективно.

Но, даже если принять точку зрения о том, что от C++, как от инструмента, в 2018 нужно отказаться. Тогда вопрос: чем его заменить?

Вот вы, например, ответить на него не можете.

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

Тогда вопрос: чем его заменить?

Вот вы, например, ответить на него не можете.

Ну так я тебя опять спрошу: заменить в какой области? Потому что вариантов просто хоть жопой жуй: от C# и Haskell до пистона с node.js.

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

Ну так я тебя опять спрошу: заменить в какой области?

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

от C# и Haskell до пистона с node.js.

Боюсь, вы опоздали лет на 10-15. Там, где эти языки C++ могли заменить, они уже заменили. Сейчас C++ живет либо в легаси (и удачи вам в переписывании 20-летнего MFC-шного или wxWindows легаси на Haskell-е), либо там, где производительность и ресурсоемкость, работа с системным API, контроль за происходящим и пр. не пустой звук.

Либо там, куда альтернативы почему-то не завезли.

Спросите, например, tailgunner-а, почему при всей его любви к Rust-у, он на Rust-е не программирует.

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