Comments 12
Вот ещё попытка сделать С более гибким
github.com/orangeduck/libCello
github.com/orangeduck/libCello
+4
Можно так:
Препроцессор работает один раз, поэтому подстановки будут осуществляться как положено, зато область видимости не захламляем. Не забываем о том, что в современных IDE автодополнение, основанное на заголовончных файлах проекта, и там будут мешаться эти volume_f и пр.
Идея интересная, главное не переборщить как в libCello. Иногда читая код, перегруженный макросами, появляется непреодолимое желание застрелить автора.
int volume(params_s in) {
return in. length * in.width * in.height ;
}
#define volume(...) \
volume((params_s){.length=1, .width=1, .height=1 , __VA_ARGS__})
Препроцессор работает один раз, поэтому подстановки будут осуществляться как положено, зато область видимости не захламляем. Не забываем о том, что в современных IDE автодополнение, основанное на заголовончных файлах проекта, и там будут мешаться эти volume_f и пр.
Идея интересная, главное не переборщить как в libCello. Иногда читая код, перегруженный макросами, появляется непреодолимое желание застрелить автора.
+5
Разве передача именованных параметров является частью стандарта C? Про extension для компиляторов слышал, про возможности самого языка — нет.
0
Сомнительные преимущества явно меркнут перед дополнительными плясками с бубном.
+2
С одной стороны здесь требуется создание дополнительного типа на каждую функцию.
С другой стороны обычно в коде не так уж и много функций, которые имеют настолько длинный набор параметров, что надо делать именованные аргументы.
С третьей стороны для этого небольшого количества функций можно и «руками» завести структуру, инициализировать её через designated inits и передавать в функцию, чтобы не вызывать разрыва мозга у читателя кода.
Вообщем спорное, но интересное решение.
С другой стороны обычно в коде не так уж и много функций, которые имеют настолько длинный набор параметров, что надо делать именованные аргументы.
С третьей стороны для этого небольшого количества функций можно и «руками» завести структуру, инициализировать её через designated inits и передавать в функцию, чтобы не вызывать разрыва мозга у читателя кода.
Вообщем спорное, но интересное решение.
+1
У VHDL тоже используют связывание параметров, это совершенно стандартная фича
(хотя позиционный вызов там тоже есть)
FUNC (X=> X0, Y=> s1);
(хотя позиционный вызов там тоже есть)
FUNC (X=> X0, Y=> s1);
0
Sign up to leave a comment.
Articles
Change theme settings
Именованные аргументы функции в C