LINUX.ORG.RU

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

 ,


2

7

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

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

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

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

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

★★★

Последнее исправление: Oxdeadbeef (всего исправлений: 2)

Даю гайдлайн:

  • не использовать исключения
  • не использовать dynamic_cast и typeid()
  • не инклюдить си++-ные заголовки
vzzo ★★★
()
Ответ на: комментарий от vzzo

Это понятно. Из моих опций это очевидно.

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

Из того, что на слуху:

Joint Strike Fighter Air Vehicle C++ Coding Standards

Google C++ Style Guide

Using C++ in Mozilla code

Если хочется совсем хардкора, можно прикупить спецификацию MISRA-C++ :)

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

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

Вот только про nostdinc там нет.

Я сомневаюсь, что это вообще где-то во вменяемых правилах расписано. Ибо, например, такой безобидный и полезный класс, как unique_ptr, описан в стандартном <memory>. Ну и вещи из <algorithm>, вроде copy, fill, for_each, transform, sort и т.д., которые не нуждаются ни в исключениях, ни в RTTI, так же окажутся за бортом.

eao197 ★★★★★
()

Это какой-то фашизм по типу -ffreestanding. С такими правилами только код ядра писать.

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

Всегда было можно. Главное чтоб за интерфейсы не вылетали.

anonymous
()

пиши на аде

anonymous
()

Ооо! :-) Ты чего это, цепепе заинтересовался?! :-) А как же Common Lisp? :-)

Я тебе так скажу :-) Можешь начать с ключика -std=c++03 :-) Стандарт 2003 года почти в 2 раза меньше стандарта от 2014 года :-) Но потом ты поймёшь, что хоть и можно написать свой класс строк, который будет быстрее раза в 2, чем std::string, оно того не стоит :-) И решишь таки использовать стандартную библиотеку :-) Потом смекнёшь, что в STL что-то есть :-) Потом погрузишься все тяжкие углы цепепе и будешь писать везде угловые скобки и потирать ладошки от того, что компилятор тебя понял и успешно применил SFINAE :-) Цепепе он же как вирус :-) Сначала начинаешь использовать его чуть-чуть :-) Потом ещё немного, ещё чуток, и глядишь, а код уже весь оброс RAII, мессивом из static_cast<Object&>(obj.method(func(obj2.method2))) и прочими угловыми скобками :-) С другой стороны, цепепе - он даже интересный :-) И даже перспективный, я бы сказал :-) Не смотря на то, что ой как много кул язычков вокруг :-)

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

Мне по работе надо написать сервис для работы с SIGTRAN. Потом ещё нужно обработать аудио поток в риалтайме.

CL конечно использую и буду использовать, только для других задач. :)

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

Ясно :-) Не ясно только будешь ли игнорить стандартную библиотеку? :-) Нормальная такая библиотека сама по себе, кстати :-)

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

Я написал про APR. Стандартной не буду. Даже не линкуюсь с ней.

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

Что, никогда ручками не приходилось vtable на сишке реализовывать? Я хочу просто сишку с классами, RAII и шаблоны. Нуля в делении не вижу.

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

Нормальная такая библиотека сама по себе, кстати :-)

template< class T > 
constexpr const T& max( const T& a, const T& b );

The greater of a and b. If they are equivalent, returns a.

Это facepalm, а не нормальная библиотека.

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

The greater of a and b. If they are equivalent, returns a.

Пардон, а что надо возвращать в этом случае, если не T&? :-)

Это facepalm, а не нормальная библиотека.

Кому как :-) Для меня facepalm когда отступы от скобочек, навроде template< class T > :-)

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

Пардон, а что надо возвращать в этом случае, если не T&? :-)

Дело не в T&, а в " If they are equivalent, returns a.".

min и max возвращают ссылку на a в случае равенства. Это не есть хорошо.

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

Дело не в T&, а в " If they are equivalent, returns a.".
min и max возвращают ссылку на a в случае равенства. Это не есть хорошо.

ЯННП. Что они должны возвращать на твой взгляд?

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

Это что?

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

min и max возвращают ссылку на a в случае равенства. Это не есть хорошо.

Ты не ответил, что *по-твоему* должна возвращать max()? :-)

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

Дэ. Меня выступления Sean Parent убедили её узнать поближе.

Ну дак, стандарт цепепе не простофили делают :-) Единственная проблема, что они, не простофили, делают его очень уж дооолго :-) Впрочем, в мире цепепе всё делается дооолго :-) Но им респект, в отличии от тех, кто на стандарт Common Lisp давно положил :-)

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

min и max возвращают ссылку на a в случае равенства. Это не есть хорошо.

А как надо? Возвращать опциональное значение?

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

Ну, «по-моему» говорить будет неправильно, т.к. не я до этого додумался. Но есть ряд соображений, по которым функция max в случае равенства должна возвращать ссылку на второй аргумент.

Простейшее соображение: есть пара чисел (x, y). Естественно ожидать, что (min(x,y), max(x,y)) это (x, y) или (y, x). Сейчас в случае равенства получается лажа: (x, x).

Из лекций самого Степанова (Notes on Programming), min и max должны уважать стабильность сортировки:

template <typename T> // T models TotallyOrdered
inline
void sort_2(T& x, T& y)
{
	if (y < x) swap(x, y); // в случае равенства оставляем всё на своих местах, мы за штабильность

	assert(x == min(x, y)); // min должна вернуть ссылку на x в случае равенства, иначе fail
	assert(y == max(x, y)); // max должна вернуть ссылку на y в случае равенства, иначе fail
}

Да, выше на странице с этим фрагментом кода он признаёт, что поведение max, которое он реализовал и которое вошло в стандарт, неверно.

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

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

Вероятно, ты в курсе, но вообще есть предложение это пофиксить (и добавить вариадик версию этой функции).

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

Вероятно, ты в курсе, но вообще есть предложение это пофиксить (и добавить вариадик версию этой функции).

Я в курсе что про неправильное поведение нередко говорят на всяких CppCon, но про пофиксить не слышал. Это вообще возможно? Это же поломает обратную совместимость.

И в каком смысле вариадик? Уже есть вариант, принимающий initializer_list.

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

Мсье не отличает ссылок от оператора взятия адреса?

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

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

Что, других критериев сложности ниасилилось?

Для меня facepalm когда отступы от скобочек, навроде template< class T >

Так это же рудимент от твоего любимого C++03.

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

Ты путаешь с nested templated arguments.

Нет.

Оно тут не при чём.

Оно тут при том, что смотрится с ними согласованней.

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

Из лекций самого Степанова (Notes on Programming), min и max должны уважать стабильность сортировки:
Да, выше на странице с этим фрагментом кода он признаёт, что поведение max, которое он реализовал и которое вошло в стандарт, неверно.

Уфф :-) Эти рассуждения чисто философские, это аргумент из идеального мира розовых пони :-) Это из-за этой-то философической догмы стандартная библиотека цепепе вызывает у тебя facepalm? :-) Лол :-)

Но раз тебе захотелось философии, хорошо :-) Стандартная библиотека не обязана быть идеальной :-) И даже если была бы обязана быть идеальной, то никогда бы ей не стала :-) Идти к идеалу - что идти к горизонту :-) Вроде прописная истина, а приходится это говорить :-) Любой стандарт, любая программа, любое произведение - всего лишь слепок достижения чье-то интеллекта на конкретный момент времени :-) Поэтому даже в стандарте цепепе уже приняли декоратор [[deprecated]], ибо времена меняются, стандарт меняется, ошибки исправляются, а стандартная библиотека остаётся :-)

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

Что, других критериев сложности ниасилилось?
Так это же рудимент от твоего любимого C++03.

Уважаемый Еспер :-) Извини, но я не понял, что ты хотел этим сказать :-) Или раскрой тему, или гуляй себе :-)

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

Эти рассуждения чисто философские

Был некогда разговор про то, почему в C++ запретили неявный каст любого указателя к указателю на void и обратно, как это было в C. Я сказал, что это потому, что такой неявный каст означал бы, что void это суперкласс для всех типов и одновременно сабкласс для всех типов. На что мне сказали то, что пишешь ты. Что это чисто философские рассуждения.

Для тебя все рассуждения уровнем повыше «ставить или не ставить пробел после открывающей скобки» это философские и не имеющие отношения к практике?

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

Это из-за этой-то философической догмы стандартная библиотека цепепе вызывает у тебя facepalm?

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

Просто там есть места, где очень базовые вещи сделаны неправильно.

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

Был некогда разговор про то, почему в C++ запретили неявный каст любого указателя к указателю на void и обратно, как это было в C.

Не в курсе с кем и когда у тебя был этот разговор, но неявное приведение T* в void* в цепепе не запрещёно :-) Обратный каст запрещён :-) Это правило языка, а не «чисто философские суждения» :-)

Для тебя все рассуждения уровнем повыше «ставить или не ставить пробел после открывающей скобки» это философские и не имеющие отношения к практике?

«Пробел после открывающей скобки» - это не философия, это facepalm :-) Вроде как сказал же :-)

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

Это facepalm, а не нормальная библиотека.
Я не говорю, что она плоха или не нужна. Знать и уметь пользоваться надо.

Извольте пояснить :-)

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

Обратный каст запрещён :-) Это правило языка, а не «чисто философские суждения» :-)

Да, обратный запрещён, в отличие от C. Не подскажешь рассуждений, которые побудили ввести это правило?

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

Не нормальная, но и не плохая. Что не ясно?

Не нормальная, не плохая, а стандартная :-) Пользуйтесь на здоровье и не парьтесь что max() возвращает ссылку на первый аргумент :-) Всё ясно :-) Об этом и речь :-)

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

Да, обратный запрещён, в отличие от C. Не подскажешь рассуждений, которые побудили ввести это правило?

Не подскажу :-) Не я их придумал, правила те :-)

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

Пользуйтесь на здоровье и не парьтесь что max() возвращает ссылку на первый аргумент

Как можно не париться, когда assertion failed?

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

Как можно не париться, когда assertion failed?

Так это же false negative :-) Не парься :-)

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

Просто там есть места, где очень базовые вещи сделаны неправильно.

Например?

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

Извини, но я не понял, что ты хотел этим сказать :-)

По пунктам:

  • Длина стандарта не является мерилом сложности языка;
  • Традиция делать отступы от угловых скобок, которая тебе не нравится, зачастую используется ради совместимости с синтаксисом вложенных параметров шаблонов, который в твоём любимом C++03 еще не был пофикшен.
Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.