Нет.Макросы в C по своей природе небезопасны, и попытка проверки типов в C сопряжена с проблемами.
Во-первых, макросы раскрываются путем текстовой подстановки в фазе компиляции, где информация о типах недоступна.По этой причине для компилятора совершенно невозможно проверить тип аргументов, когда он выполняет расширение макроса.
Во-вторых, когда вы пытаетесь выполнить проверку в расширенном коде, например assert
ввопрос, ваша проверка откладывается до времени выполнения и также сработает на казалось бы безвредных конструкциях, таких как
a = read_16(REG16_A);
, потому что перечислители (REG16_A
, REG16_B
и REG16_C
) имеют тип int
ине типа REG16
.
Если вы хотите безопасность типов, лучше всего использовать функцию.Если ваш компилятор поддерживает это, вы можете объявить функцию inline
, чтобы компилятор знал, что вы хотите избежать возможного использования служебных вызовов везде, где это возможно.