Обобщённые макросы

В языке Си функции нельзя перегружать (англ. overload) — иметь несколько функций с одинаковыми названиями, но разным поведением (в основном из-за типа или количества принимаемых аргументов). В стандарте c11 появилось новое ключевое слово _Generic, которое позволяет создавать «обобщённые» макросы1.

Данное ключевое слово позволяет сделать выбор на этапе компиляции. Макрос ниже позволяет «выяснить» тип переменной:

Рассмотрим другой пример. Допустим, нужно сравнивать (узнать, какой «старше») какие-нибудь ID, причём они могут быть как целочисленными, так и строчными.

Лучше написать обобщённый макрос и работать с ним, чем каждый раз вспоминать, что нужно добавить к имени функции, чтобы код скомпилировался.


1 Решение довольно странное и очень неудобное. Если в функции переменное количество аргументов, то _Generic вам не поможет. Плюс ко всему, в отличие от перегрузки, где компилятор автоматически генерирует нужное количество функций с нужными типами, в Си вам придётся прописывать их вручную. По всей видимости, введение _Generic-макросов было нужно для упрощения работы с math.h. Например, для расчёта арккосинуса в зависимости от принимаемого аргумента нужно было вызвать одну из шести функций. Теперь, подключая tgmath.h, можно про это забыть и вызывать только acos().