Перегрузка оператора в C - PullRequest
26 голосов
/ 05 августа 2010

Я пытаюсь перегрузить некоторые операторы:

/* Typedef is required for operators */
typedef int Colour;

/* Operators */
Colour operator+(Colour colour1, Colour colour2);
Colour operator-(Colour colour1, Colour colour2);
Colour operator*(Colour colour1, Colour colour2);
Colour operator/(Colour colour1, Colour colour2);

Я получаю эту ошибку для каждой пробной перегрузки:

expected '=', ',', ';', 'asm' or '__attribute__' before '+' token

Я не могу найти хорошую документацию по перегрузке оператора. Результатом поиска в Google является учебник по C ++, в котором используются классы. В Си нет классов. Может кто-нибудь мне помочь? Спасибо.

Ответы [ 7 ]

55 голосов
/ 05 августа 2010

C не поддерживает перегрузку операторов (помимо того, что встроено в язык).

21 голосов
/ 05 августа 2010

Оператор не перегружен в C.

16 голосов
/ 15 марта 2013

Вам понадобится машина времени , чтобы вернуться в 1985 г., чтобы вы могли использовать программу CFront .Похоже, что «C» используется для поддержки перегрузки операторов;достаточно сложным, он все еще может.См. Внутри объектной модели C ++ от Стэнли Б. Липпман .OMG, C ++ был C!Такая вещь все еще существует.

Этот ответ подтверждает остальные.Само по себе «C» не поддерживает перегрузку.Однако важным моментом является то, что программист может писать код, который понимает код.Вам нужен инструмент, который преобразует источник для реализации этого.В этом случае такие инструменты уже существуют.

В статье, Мета-компиляция для C ++, 2001 , написанной Эдвардом Д. Виллинком, есть интересные примеры функциональности дизайна , где полезно расширение языка.Сочетание * nix shell-скрипта и make правил часто позволяет такое преобразование.Другими примерами являются Qt MOC, инструменты Lex и Yacc и т. Д. Так что, хотя само C не учитывает это непосредственно, оно работает, если вы создаете host tools.

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

15 голосов
/ 05 августа 2010

Вы не можете перегрузить эти операторы в C.

7 голосов
/ 05 августа 2010

C вообще не поддерживает перегрузку операторов.

Вы можете реализовывать операции только как функции:

Colour colour_add(Colour c1, Colour c2);
Colour colour_substract(Colour c1, Colour c2);
...

Вы также можете переключиться на C ++, но это может быть излишним.только для перегрузки.

5 голосов
/ 05 августа 2010

Перегрузка операторов недоступна в C. Вместо этого вам придется использовать функцию для «псевдо-перегрузки» операторов:

Colour add_colours(Colour c1, Colour c2) {
    return c1 + c2; // or whatever you need to do
}
0 голосов
/ 21 октября 2015

Если вы хотите сопоставить краткость, лучше всего использовать макросы:

void Type_getSomething(int id); //or some other complex series of instructions

#define g(id) Type_getSomething(id)

... жаль, что использование квадратных скобок для макросов невозможно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...