Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Многочисленные const, static, дефайны вместо комментирования и прочее несколько запутывают при чтении.вызывает у меня эфект «гусиной кожи», когда я представляю код, написанный вами согласно этой фразе. Я так понимаю, вы предпочитаете сознательно лишать себя и других возможности переложить часть рутины на компилятор. Т.е. вы для аргументов функции вместо const A* a предпочитаете писать просто A*, а потом просто запоминаете, что эта функция не меняет память по указателю и ей можно доверять?
if (case_one)
{
some = one;
}
else if (case_two)
{
some = two;
}
else if (case_three)
{
some = three;
}
else if (case_four)
{
some = four;
}
else
{
do_nothing();
}
if (case_one ) some = one ;
else if (case_two ) some = two ;
else if (case_three) some = three;
else if (case_four ) some = four ;
esle
do_nothing()
std::vector<const std::string>::reverse_const_iterator left; std::vector<const std::string>::reverse_const_iterator right; std::vector<const std::string>::reverse_const_iterator middle;
std::vector<std::string>::reverse_const_iterator left, right, middle;
Язык программирования — тоже язык. Хороший код не просто решает поставленную задачу, читая его должно приходить понимание того, ЧТО хотел донести автор. Но почему же static или const запутывают код. Static перед функцией или переменной в Си, означает, что не нужно искать применение этих символов где то еще, то есть разработчику не нужно искать эти символы где то еще в проекте, достаточно пройтись по файлу. const в перед аргументом функции показывает, что данные не будут изменены. То есть, эти служебные слова несут дополнительную семантику, а это на мой взгляд всегда упрощают понимание кода.
#if 0
#endif
if (case_one) {
doOneThing();
} else if (case_two) {
doSecondThing();
} else if (case_three) {
doThirdThing();
} else if (case_four) {
doFourthThing();
} else {
doDefaultThing();
}
bool run = true;
void func1() void func2()
{ {
while(run) again:
{
led_blink(); led_blink();
} goto again;
} }
с точки зрения стандарта, эти функции эквивалентны
run в false.int32_t y=(x<<26)>>29; // get bits 3..5 with extended sign
— это же идиома?
int32_t y = ((((uint32_t)x >> 3) & ((1u << 3) - 1)) ^ (1u << 2)) - (1u << 2);
uint32_t f(uint32_t x)
{
return (((x >> 3) & ((1u << 3) - 1)) ^ (1u << 2)) - (1u << 2);;
}
с помощью GCC компилируется вf(unsigned int):
movl %edi, %eax
sall $26, %eax
sarl $29, %eax
ret
Поэкпериментировать можно тут gcc.godbolt.orgСдвиг отрицательных чисел приводит к неопределённому поведению.
if(5==foo) bar();
… как известно, мы пишем программы не для компьютеров, а для других людей, и мне, например, значительно понятнее код, когда я его могу увидеть весь на экране без необходимости роллирования.
// где-то в хедере
#ifdef DEBUG
# define DBG_OUTPUT(x) Logger::putline((x));
#else
# define DBG_OUTPUT(x)
#endif
// где-то в коде
if (count > 500) DBG_OUTPUT("Too many entries!")
for (int i = 0; i < count; ++i)
{
//...
}
# define DBG_OUTPUT(x) ;
или# define DBG_OUTPUT(x) {}
чтобы макрос всегда раскрывался в оператор? А то «правило 1» здесь выглядит, как попытка замаскировать ошибку, сделанную в другом месте.do { <опциональный код здесь> } while (0)
#ifdef DEBUG
# define DBG_OUTPUT(x) Logger::putline((x))
#else
# define DBG_OUTPUT(x)
#endif
— чтобы нужно было писатьDBG_OUTPUT(x);
if (count > 500) DBG_OUTPUT("Too many entries!");
Надо делать над собой усилие и переходить к правильному стилю (это я в первую очередь себя убеждаю).
Надо делать над собой усилие и переходить к правильному стилю
Т.е. потребление памяти скорее увеличится.Каким образом? Непосредственные (immediate) значения обычно кодируются прямо в инструкциях
И чревато сюрпризами с модульностью.Что вы имеете ввиду под модульностью, и какие проблемы с ней могут возникнуть?
#define SQUARE(A) ((A)*(A))
inline uint32_t square(uint16_t a)
{
return (a * a);
}
на моем IAR inline без static вообще не работает — падает при линкованиии
23. Не пишите const char * вместо char const *.
const char, но char const запрещена. В этом языке убрали неоднозначность в пользу первого варианта.char const мне режет глаз, как грамматическая ошибка — постоянно мозг встречает другой порядок, и запоминает его, как правильный.В операторе if при проверке на равенство константе всегда ставьте константу влево, а переменную справа. Убиваем двух зайцев — получается код нагляднее, и Вы защищены от ошибочного присваивания (если вдруг вместо == нечаянно ввели =).Yoda style? Сомнительный совет.
10 главных правил убивания жуков