#c #typedef
В процессе изучения появилась такая мысль использования typedef: #includetypedef int height; typedef int width; typedef int mul; mul sq(height,width); int main(){ width h=5;/*or 'int' or other type*/ width w=17; printf("%d\n",sq(h,w)); } mul sq(height h,width w){ return h * w; } но фишка не удалась. И я, как и следовало ожидать, получил не то что хотел.Я понял, что у меня в примере функция аналогична такой: int sq(int h,int w){ return h * w; } А хотелось бы, чтобы при принятии в функцию не соответствующего типа выходила ошибка или предупреждение компилятора. Как это реализовать?
Ответы
Ответ 1
В языке С создание пользовательских типов, способных нести произвольные данные, возможно только через определение новых struct-типов, array-типов или enum-типов. Enum-типы в С всегда целочисленны и свободно конвертируемы между собой, что делает их непригодными для решения данной задачи. Array-типы подходят плохо, имеют свойство деградировать до указателей и являются некопируемыми, что делает их непригодными для решения данной задачи тоже. Остаются только struct-типы. Придется заворачивать значения в struct-типы с одним полем. Это, однако, сделает код довольно перегруженным повторяющимися синтаксическими деталями. Составные литералы и, возможно, _Generic помогут сделать код более элегантным, но превратить С в С++ все равно не смогут. Так что вопрос в том, насколько сильно вам этого хочется. #includetypedef struct { int value; } height; typedef struct { int value; } width; typedef struct { int value; } area; area sq(height h, width w) { return (area) { h.value * w.value }; } int main() { width h = { 5 }; width w = { 17 }; height h2 = { 5 }; // printf("%d\n", sq(h, w).value); printf("%d\n", sq(h2, w).value); }
Комментариев нет:
Отправить комментарий