Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Способ уменьшения ошибок в программе

#c #typedef


В процессе изучения появилась такая мысль использования typedef:

#include

typedef 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 помогут сделать код более элегантным, но превратить С в С++ все равно не смогут. Так что вопрос в том, насколько сильно вам этого хочется. #include typedef 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); }

Комментариев нет:

Отправить комментарий