Макросы в Си могут частично заменить перегрузку функций других языков. Как указывает Cat Plus Plus в своем ответе, C11 имеет дополнительную конструкцию _Generic
для программирования типов макросов.
С C99 у вас уже есть возможность программировать макросы, которые в некотором смысле являются типичными. P99 имеет средства, которые облегчают его использование, например, для вызова такого макроса с другим количеством параметров. Чтобы определить, какую функцию вызывать в соответствии с конкретным параметром A
, вы можете использовать что-то вроде (sizeof(A) == sizeof(float) ? sqrtf(A) : sqrt(A))
.
Gcc имеет расширения, которые позволяют программировать такие вещи еще более удобно, а именно: блочные выражения с ({ any code here })
и typeof
для объявления вспомогательных переменных того же типа, что и параметр макроса.