Size: a a a

2020 September 20

D

Dr Zlo in Embedded Group
Крылатый Пегас
Визитор можно залепить) только придётся плюсы юзать.
поясни, не понял как это упростит код
пример из практики:
switch (fnv1a_string_hash(command)) {
       case fnv1a_string_hash("open"): {
           commandOpenFile(command_data);
           break;
       }
       case fnv1a_string_hash("valid"): {
           commandFileValid(command_data);
           break;
       }
       case fnv1a_string_hash("write"): {
           commandFileWrite(command_data);
           break;
       }
       ....
}
источник

D

Dr Zlo in Embedded Group
Ком 123
Пример можно? Я пока не представляю сценария, где нельзя сделать return по сравнению с кодом возврата и не париться о куче/периферии
можно-то буквально везде, но это оборачивается дублированием кода, что не есть хорошо
источник

К1

Ком 123 in Embedded Group
вызов функции как бы сам подразумевает что ты внутри выделяешь память, анализируешь, освобождаешь и возвращаешь код ошибки. В этом и смысл дробления больших задач на кучу маленьких, чтобы распределять ресурсы и контролировать их в маленьких блоках, а не в одной большой простыне.
источник

D

Dr Zlo in Embedded Group
Ком 123
вызов функции как бы сам подразумевает что ты внутри выделяешь память, анализируешь, освобождаешь и возвращаешь код ошибки. В этом и смысл дробления больших задач на кучу маленьких, чтобы распределять ресурсы и контролировать их в маленьких блоках, а не в одной большой простыне.
так с goto не подразумевается прыжок вовне функции, посмотри выше кодстайл линукса
источник

D

Dr Zlo in Embedded Group
он просто используется для парадигмы "только одна точка выхода из функции"
источник

D

Dr Zlo in Embedded Group
которая упрощает чтение и понимание кода
источник

К1

Ком 123 in Embedded Group
Dr Zlo
так с goto не подразумевается прыжок вовне функции, посмотри выше кодстайл линукса
Я понимаю, о чём речь, но всё равно такая себе практика, как по мне. Как я и писал выше, ничем не хуже return по коду ошибки.
источник

D

Dr Zlo in Embedded Group
источник

К1

Ком 123 in Embedded Group
Ну и всё равно идёт сравнение с кодом ошибки и переход, что, в принципе, равно вызову функции со сравнением. Если нельзя деаллоцировать ресурсы после их использования - это косяк составления алгоритма. Либо они должны быть глобальными, либо это должны быть ресурсы, выделяемые и освобождаемые сразу после использования и со спокойным return-ом. Я думаю, что вполне можно обойтись без goto при тех же трудозатратах(максимум - незначительном увеличении размера кода).
источник

К1

Ком 123 in Embedded Group
Хотя я сейчас перечитал кусок нашего диалога и понял, что это похоже на холивары Pascal vs C или Dephi vs C++
источник

К1

Ком 123 in Embedded Group
Может быть и правда есть кодстайл, где goto смотрится вполне органично
источник

L

LexsZero in Embedded Group
источник

L

LexsZero in Embedded Group
Ком 123
Пример можно? Я пока не представляю сценария, где нельзя сделать return по сравнению с кодом возврата и не париться о куче/периферии
потому что тебе нужно как-то освободить аллоцированые с начала функции до момента возникновения ошибки ресурсы, а RAII в сишку как-то не завезли.
источник

L

LexsZero in Embedded Group
даже банально чтоб взятые локи отпустить
источник

L

LexsZero in Embedded Group
можно конечно городить контекст-менеджеры, например в том же линуксе devm_*() инфраструктура избавляет от значительного количества ручной возни с корректным отпусканием ресурсов при ошибках.
источник

L

LexsZero in Embedded Group
а, другая альтернатива - это лесенки из ифов. но когда я вижу лесенку из 15 вложенных ифов, мне хочется оторвать руки тому кто это писал.
источник

К1

Ком 123 in Embedded Group
Ну 15 - это перебор. Я ж говорю, есть ассерты для этого. делаешь #define assert(exp) ? (void *) 0 : return assert_failed(FILE, LINE) #define assert(exp) ? (void *) 0 : return assert_failed(FILE, LINE) и всё, в общем-то, ништяк.
источник

L

LexsZero in Embedded Group
нет, не ништяк.
void do_cool_shit() {
 Foo *foo = get_foo();  /* foo must be released when not needed */
 /* here we do shit with foo that may fail */
 Bar *bar = get_bar();  /* also must be released */
 /* here we do some other shit with foo & bar that may fail */
 /* ok now we're done */
 put_bar(bar);
 put_foo(foo);
}
источник

L

LexsZero in Embedded Group
как тут помогут ассерты?
источник

СС

Сиие Сууие in Embedded Group
LexsZero
а, другая альтернатива - это лесенки из ифов. но когда я вижу лесенку из 15 вложенных ифов, мне хочется оторвать руки тому кто это писал.
Встретил альтернативный вариант, сперва не понял, но потом прозрел как лаконично
Do{
If(some){
Return
}
If(some 2){
Return
}
....
}While(0)
источник