Можно ли перегрузить операторы в C?

Можно ли перегрузить операторы (например, операторы сравнения) в C?

Если так, то как ты это делаешь? Я сделал быстрый поиск, но все, что я нашел, было для C++, и что я хочу, это для C.

У кого-нибудь есть идеи?

Edit1: идея заключается в следующем: у меня есть структура, и мне нужно сделать сравнение (на основе члена структуры). И для этого я хотел бы связать операторов по сравнению с моим новым "типом данных".

Edit2: я полностью осознаю, что я могу обойтись без использования перегрузки операторов, но мне было интересно, если вы можете сделать это с перегрузкой.

Ответ: Концепция перегрузки связана с объектно-ориентированным программированием. Поскольку C не является объектно-ориентированным и, следовательно, не может содержать концепцию перегрузки. (:

4 ответа

Решение

Нет, это невозможно. C не поддерживает перегрузку операторов.

Если под перегрузкой вы подразумеваете определенные пользователем перегрузки операторов, то ответ - нет. Тем не менее, некоторые из предопределенных операторов, таких как *, + и т. д. перегружены (если вы об этом думаете) для арифметических типов. * является особенным, поскольку он также имеет перегрузку для разыменования указателей.

C не поддерживает перегрузку операторов или функций. Там нет, как вы можете переопределить <, <=, >, >=, ==, или же != сравнивать типы структур напрямую.

Начиная с C11 вы можете перегружать функции, используя макросы с _Generic. Он позволяет выбрать одно из нескольких выражений во время компиляции на основе типа управляющего выражения.

Например (он также работает с более чем одним параметром):

      #define f(X) _Generic((X),         \
        uint8_t:  f_uint8_t(X),    \
        uint16_t: f_uint16_t(X),   \
        uint32_t: f_uint32_t(X)    \
    )

Таким образом, вместо стандартных операторов вы можете определить такие макросы, как ADD(X, Y); SUB(X, Y) и т. д.

https://en.cppreference.com/w/c/language/generic

Другие вопросы по тегам