LINUX.ORG.RU

Где нибудь есть гайдлайны и/или кодингстайлы при использовании restricted subset of C++

 ,


2

7

Под «restricted» подразумевается сборка с опциями:

CXXFLAGS="-fno-exceptions -fno-rtti -nostdinc++"

Все что мне нужно от обрезаных плюсов:
1) RAII
2) немного шаблонов
3) виртуальные функции
4) нэймспэйсы

В остальном, это будет сишка.

Линковаться будет только с сишными либами, в качестве стд либы будет APR.

★★★

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

Длина стандарта не является мерилом сложности языка;

Попробуй, докажи :-)

который в твоём любимом C++03 еще не был пофикшен.

С чего ты взял, что это мой любимый язык? :-) У меня вообще нет любимых языков :-)

Балабол? :-)

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

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

Ах да, кстати, не подскажешь ради чего используется традиция делать отступы от круглых скобок:

constexpr const T& max( const T& a, const T& b );

Ради выражения своей скобкофобии? :-) Лол :-)

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

Попробуй, докажи :-)

Что проще читать и писать:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template<typename T> struct printer {
    void operator()(const T& data) const {
      cout << data << endl;
    }
};

int main() {
  vector<string> v;
  v.push_back("blahblah");
  v.push_back("lala");
  v.push_back("kokoko");
  for_each(v.begin(), v.end(), printer<string>());
}

или

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
  vector<string> v = {"blahblah", "lala", "kokoko"};
  for_each(v.begin(), v.end(), [](const auto& a) { cout << a << endl; });
}

?

С чего ты взял, что это мой любимый язык?

Это фигура речи. Имелась в виду твоя странно обоснованная тяга к старым стандартам.

Ах да, кстати, не подскажешь ради чего используется традиция делать отступы от круглых скобок

Мне откуда знать? Я не знаком с людьми, которые так делают.

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

Что проще читать и писать:

Для профессионала одинаково :-)

Только весь курьёз этого, так сказать, «доказательства» не зависимости сложности языка от размера его стандарта заключается в том, что главным аргументом этого «доказательства» является всё тот же размер :-) Только уже не стандарта, а игрушечного «здравствуймира» :-)

На что я тебе ещё раз подытожу: чтобы написать или прочитать второй вариант этого «здравуствуймира» нужно знать про списки инициализации и лямбды из 14-го в довесок к потокам, векторам, строкам, алгоритмам, шаблонам, перегрузкам, пространствам имён из 03-го стандарта :-) Кратко написанный код выразителен лишь тогда, когда ясна его семантика :-) Что, будешь утверждать, что семантика цепеп 14 с его всякими rvalue, auto, универсальными ссылками, сворачиванием ссылок, правилами генерации специальных членов класса и т.д. и т.п. легче, чем в 03-м? :-) Лол :-) Всё это требует дополнительный знаний, и не малых :-) А раз знаний для написания и чтения кода на языке, соответствующего 14-му стандарту требуется больше, то и само собой очевидно, язык от этого сложнее :-) Так что «здравуствуймиры» с auto и лямбдами не аргумент ни сколько :-)

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

Имелась в виду твоя странно обоснованная тяга к старым стандартам.

Причём тут я? :-) Ты хоть почитай с чем пришёл сюда OP :-) Ему нужен урезанный цепепе с виртуальными функциями, раии, шаблонами и неймспейсами :-) Всё это есть в стандарте от 1998 года :-) Т.е. OP может запускать свои решения на какой-нибудь OpenBSD, где до сих родной компилятор ни о каком цепепе 11/14 ни ухом ни рылом :-)

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

Что проще читать и писать:

кстати неплохо проиллюстрированный тупик майнстрима. Оба варианта г??но.

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

Можешь начать с ключика -std=c++03

Зачем ты человеку предлагаешь работать в говне, когда уже овер 5 лет есть неговно?

Стандарт 2003 года почти в 2 раза меньше стандарта от 2014 года

Ога, потому что обратная совместимость требует тащить говна из 03, да ещё и немного нового говна сотворили (почитать того же мейерса, от которого оргазмируют цппшники - он чотко англицким по белому написал, что возможность дефолтного захвата в лямбдах - говно, приводящее к неочевидным ошибкам и использовать её не надо; хотя казалось бы, новый стандарт пилили, могли бы уж тупых ошибок не делать, но это же цпп)

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

for_each(v.begin(), v.end(), [](const auto& a) { cout << a << endl; });

И зачем, когда можно

for (auto const& a : v) { cout << a << endl; }

?

Стандарт недоучил? Или хотелось лямбдами покрасоваться там, где они не нужны?

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

Ты хоть понимаешь, что сам-то написал?

Если x РАВЕН y, то они внезапно РАВНЫ и (x, y) РАВЕН (y, x) и РАВЕН (x, x) и (y, y). И если ты адреса не начнёшь сравнивать, то при x==y получишь x==max(x, y) && y==max(x, y).

А если ты зачем-то адреса начнёшь сравнивать, так уж имей мозги обработать случай с равенством отдельно.

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

Твоё счастье, щенок, что min и max возвращают const T&. Но кто-нибудь недовольный этим фактом и знающий, что в его ситуации это безопасно, может выкастануть const нафиг и присвоить что-нибудь x и y. И этот кто-нибудь хочет чтобы компоненты пары были всегда разными, если они были разными до отправки в min и max

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

Но кто-нибудь недовольный этим фактом и знающий, что в его ситуации это безопасно, может выкастануть const нафиг и присвоить что-нибудь x и y

Лол, давно так не смеялся. Всем давно известно, что в ц и цпп много способов выстрелить себе в ногу (эти язычки чуть ли не специально под это пилили), так что если какой-то ссзб делает конст каст - пусть озаботится почитать стандарт на функции, которые использует и ВНЕЗАПНО обнаружит там, что никто ему не гарантировал поведение, которого ты здесь так жаждешь.

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

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

Зачем ты человеку предлагаешь работать в говне, когда уже овер 5 лет есть неговно?

Причём тут я? :-) Он сам себе предлагает поработать с/в цепепе :-) Лол :-) Причём он чётко сформулировал фичи, которые ему нужны, причём дополнил, что «В остальном, это будет сишка.» :-) Т.е. все эти фичи есть стандарте 1998 года :-)

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

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

Ты хочешь сказать, что min/max возвращают ссылку не на свои аргументы, а на что-то другое?

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

может выкастануть const нафиг и присвоить что-нибудь x и y.

Такие механизмы, как константность или закрытые члены данных, придуманы для защиты от непреднамеренного нарушения правил, о чём говорил Страуструп :-)

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

Ты хочешь сказать, что min/max возвращают ссылку не на свои аргументы, а на что-то другое?

Мне это как бы побоку. Там const не зря стоит. А вот некоему другому анонимусу не нравится, что min/max могут вернуть ссылку на один и тот же аргумент, а не два разных. Ну и дальше вот это всё про конст каст и так далее. Конст каст сам по себе будет работать если min/max возвращают ссылку на свои аргументы (а в общем случае они и будут их возвращать - не будут же там локальные копии создаваться в самом деле), но вот

assert(x==y);
const_cast<T&>(min(x,y)) = new_x;
const_cast<T&>(max(x,y)) = new_y;
assert(x == new_x); // fail
assert(y == new_y); // fail

обломается.

Кстати, кто заметил, что в этом коде что-то не так помимо вышеуказанной фигни с min/max - молодец.

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

Мне это как бы побоку.

Т.е. ты не можешь ответить на этот вопрос. Как говорится, «мы вам перезвоним» :-)

Там const не зря стоит.

Тащем-то зря, он там ДАЛЕКО не всегда обязателен. Он там только в силу исторических причин.

Конст каст сам по себе будет работать если min/max возвращают ссылку на свои аргументы

«если»?! Т.е. ты допускаешь другие варианты?! :-O

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

что «В остальном, это будет сишка.»

Ога, сишка с виртуальными функциями, лол. Так вот и скажи, зачем в этой «сишке» не использовать лямбды и (если интересует производительность) rvalues и move semantics? Не говоря уже об auto, после которого на 03 и даже казалось бы не относящуюся к делу жабу без слёз смотреть сложно. А ещё енумы человеческие. А ещё.. да много там добра, зачем продолжать в говне ползать?

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

Ога, сишка с виртуальными функциями, лол.

Ога, сишка с виртуальными функциями :-) Лол :-) А что тут лол? :-)

Не говоря уже об auto, после которого на 03 и даже казалось бы не относящуюся к делу жабу без слёз смотреть сложно.

Если применение auto сводится к дедукции типов итераторов, то это не аргумент :-) Ну да, короче смотрится код, но не аргумент :-) Применение auto в шаблонном метапрограммировании куда более интереснее, но я сомневаюсь, что OP будет с этим связываться :-)

А ещё енумы человеческие.

Ой-ой :-) Где-то эти самые енумы задалбывают необходимостью указывать квалификатор :-)

А ещё.. да много там добра, зачем продолжать в говне ползать?

Лол :-)

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

«если»?! Т.е. ты допускаешь другие варианты?! :-O

Внезапно, да. Если точнее - зависит от точки зрения.

#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;

int main() {
    vector<bool> bools = { true, false, true, false };
    auto const& a = bools[0];
    assert(&max(bools[0], bools[1]) == &a);
}

И да, в этом случае компилятор тебе вряд ли даст скастовать в T&, ибо типы не совпадут. Но если ты конст каст писал в шаблоне, но кто-то юзающий твой код может словить весёлую ошибку.

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

Внезапно, да. Если точнее - зависит от точки зрения.

Лол. Любитель озабочивать других почитать стандарт сам не озаботился этим и теперь начал маневрировать «точками зрения».

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

А что тут лол? :-)

То, что это уже не сишка, а сишка с классами, наследованием и прочим ооп.

Если применение auto сводится к дедукции типов итераторов, то это не аргумент :-) Ну да, короче смотрится код, но не аргумент :-)

Попробуй в большой кодовой базе поменять возвращаемое значение функции с одного типа на другой эквивалентный (да те же итераторы, к примеру, если type erasure никто не сделал или даже если его же и нужно переделать). Если используется auto - никто ничего не заметит, а если явные типы - придётся кучу кода ворошить. (да, кто-то скажет, что то, что код ломается при поломке интерфейса - хорошо; но пусть тогда не только переменным типы указывает, но и при каждом вызове функции, а мы поржём)

Где-то эти самые енумы задалбывают необходимостью указывать квалификатор :-)

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

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

Лол. Любитель озабочивать других почитать стандарт сам не озаботился этим и теперь начал маневрировать «точками зрения».

Ты код-то запустил, словил ассёршн фейл? И объясни тогда, почему оно так, если возвращается ссылка на аргумент.

anonymous
()

Ладно анонимусы, приятно было пообщаться с такими умными людьми, но я пойду сольюсь - код писать.

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

Послушай, мамкин разоблачатель, я ясно написал

знающий, что в его ситуации это безопасно

Ну выкатил ты заведомо небезопасный пример. И чо?

Ты код-то запустил, словил ассёршн фейл? И объясни тогда, почему оно так, если возвращается ссылка на аргумент.

Фейл ассёршена никак не опровергает того, что возвращается ссылка на аргумент.

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

знающий, что в его ситуации это безопасно

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

Фейл ассёршена никак не опровергает того, что возвращается ссылка на аргумент.

Мне оч. интересно послушать, как ты это проверишь.

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

А если ты зачем-то адреса начнёшь сравнивать, так уж имей мозги обработать случай с равенством отдельно.

А с какого хрена мне обрабатывать отдельно? Ну кроме того, что Степанов жиденько облажался с поведением элементарных функций.

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

Для профессионала одинаково :-)

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

Только весь курьёз этого, так сказать, «доказательства» не зависимости сложности языка от размера его стандарта заключается в том, что главным аргументом этого «доказательства» является всё тот же размер :-)

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

списки инициализации

В большинстве случаев это тупо экстраполяция сишного синтаксиса инициализации на крестовые классы.

лямбды

Кто про них не знает в двадцать первом веке?

rvalue

Уже сто лет в крестах.

auto

Просто.

универсальными ссылками

Нинужно в повседневном коде.

сворачиванием ссылок

Даже не знаю, что это.

правилами генерации специальных членов класса

Просто.

Всё это требует дополнительный знаний, и не малых

Если их нет, твой код не поломается.

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

Не «требуется», а «желательно иметь».

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

Или хотелось лямбдами покрасоваться там, где они не нужны?

Скорее, лень придумывать хелворд, в котором они реально нужны.

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

То, что это уже не сишка, а сишка с классами, наследованием и прочим ооп.

Странно, что ты вспомнил про ООП, но не увидел очевидного :-) Давай я тебе поясню в терминах этого самого ООП :-) «Сишка с классами» является надмножеством «сишки», т.е., в терминах ООП, «сишка с классами» наследует «сишку», т.е. «всякая сишка с классами» *является* «сишкой» :-) Если тебя это не объяснили в своё время, то запомни сейчас и больше ерунду не говори :-) Лол :-)

Попробуй в большой кодовой базе поменять возвращаемое значение функции с одного типа на другой эквивалентный ...
Если используется auto ...
а мы поржём

Зачем ты мне это рассказываешь? :-) Это всё известно, но ничего не доказывает, ни о чём не говорит :-) Ибо известно также, что есть великое множество «больших кодовых баз», где люди обходятся не то, что «сишкой с классами», а чистой «сишкой» стандарта 1989 года, причём успешно продвигая свою разработку в массы :-) Взять хотя бы тот же Постгрес :-) И это пока вы, некие любители auto, ржете :-) Лол :-)

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

Речь о том, что цепепе 14 во много раз сложнее, чем цепепе 03 :-) Потому что знать надо больше :-) То, что тебе что-то там «просто» в цепепе 14, это похвально, но это твои личные достижения :-) Причём тут остальные, которые не хотят тратить время на изучение и, самое главное, на применение фич цепепе 14? :-) Зачем ты бессмысленно пытаешься мне доказать, что цепепе 14 проще, чем цепепе 03 на этом фоне, мне не ясно :-)

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

Зачем ты бессмысленно пытаешься мне доказать, что цепепе 14 проще, чем цепепе 03 на этом фоне, мне не ясно :-)

ИМХО, 14 конечно сложнее 03, но писать на нем можно намного проще.

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

ИМХО, 14 конечно сложнее 03, но писать на нем можно намного проще.

Ты хотел сказать, видимо, что на цепепе 14 можно писать, применяя меньшее число костылей, и более богатую стандартную библиотеку :-) Но проще от этого он не стал, а наоборот :-)

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

В Google уже разрешили использовать исключения?

Там не используют исключения в «своем» коде, но если new пытается генерировать исключение, то они с этим работают. Т.е. они не отключают исключения насовсем при компиляции и линковке. Так что, скорее всего, -fno-exceptions это не про них.

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

Но проще от этого он не стал, а наоборот :-)

Чисто для справки: Брейнфак ты тоже считаешь простым языком?

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

И в каком смысле вариадик?

std::min(T, ...)

Но вообще да, поискал предложение - оно датировано 2008-02-28. Наверное из-за совместимости и отклонили.

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

Чисто для справки: Брейнфак ты тоже считаешь простым языком?

Не страдай фигнёй :-) Какой брейфак? :-) Лол :-) Чисто для справки - простой язык в сравнении с цепепе - язык Си :-)

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

Если x РАВЕН y, то они внезапно РАВНЫ...

В сравнении могут участвовать не все члены класса и в этом случае грабли могут вылезти и без всяких адресов.

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

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

Во многих языках это работает и даже в плюсах оно может быть удобно (и безопасно).

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

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

Ну так нужно выбирать, достижениями чьего интеллекта пользоваться и стандартизировать. К достижениям «интеллекта» выпускников МГУ лучше не прикасаться.

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