Перевантаження функцій в сі
У Сі стандарту С11 з'явилися дженерик макроси, які дозволяють створювати функції загального призначення. Дженерик макрос дозволяє вибрати функцію в залежності від типу аргументів, переданих у функцію. Це, в деякому роді, схоже перевантаження методів за типом аргументу в багатьох мовах, однак, це не динамічна диспетчеризація - визначення типу аргументу відбувається тільки на етапі компіляції.
Так як це нововведення Сі 11, то для роботи буде потрібно нова версія компілятора, яка підтримує стандарт. Для прикладу використовується gcc версії 5.3.0 з прапором -std = c11. На Windows без проблем ставиться пакет MinGW, до складу якого входять всі необхідні утиліти.
Розглянемо на простому прикладі: функція повертає переданий аргумент плюс один. Спочатку визначимо всі функції, які можуть бути виконані, з усіма типами аргументів, які нам необхідні
Далі сам макрос
Ця система схожа на оператор switch. Замість foo буде підставлена одна з функцій, а далі (X) - виклик з цим аргументом. Дефолтний значення - коли тип визначити не можна. Якщо тип не визначений і немає дефолтного значення, чи воно не може бути використано функцією за замовчуванням, то це помилка. ось програма
Для функції з двома аргументами трохи складніше, треба описати всі комбінації. У нашому випадку функція може приймати аргументи типу float і int, складати їх і повертати ціле
Звичайно, можна замість трьох макросів об'єднати все в один
Ось ще один приклад: макрос, який виводить ім'я типу, переданого в нього
Зауважте важливі особливості - без явної вказівки 'a' буде розглядатися як int, а рядок як модифікується, хоча спроба її змінити призведе до помилки. Для точного определеніятіпа можна його явно привести
Також тип може бути аргументом макросу
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students