Pull to refresh

Comments 12

Можно так:

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. Иногда читая код, перегруженный макросами, появляется непреодолимое желание застрелить автора.
Разве передача именованных параметров является частью стандарта C? Про extension для компиляторов слышал, про возможности самого языка — нет.
Да, в С99. Называется designated initializers.
Тогда я очень недоволен MS и их «поддержкой» C99.
Надо отметить, что в стандарт С++ (не обычного C) эта фишка ещё не вошла, возможно дело в этом.
Сомнительные преимущества явно меркнут перед дополнительными плясками с бубном.
С одной стороны здесь требуется создание дополнительного типа на каждую функцию.
С другой стороны обычно в коде не так уж и много функций, которые имеют настолько длинный набор параметров, что надо делать именованные аргументы.
С третьей стороны для этого небольшого количества функций можно и «руками» завести структуру, инициализировать её через designated inits и передавать в функцию, чтобы не вызывать разрыва мозга у читателя кода.

Вообщем спорное, но интересное решение.
А можно эти дополнительные типы запрятать в другой макрос: например
У VHDL тоже используют связывание параметров, это совершенно стандартная фича
(хотя позиционный вызов там тоже есть)

FUNC (X=> X0, Y=> s1);
Sign up to leave a comment.

Articles

Change theme settings