В макросах есть пара сугубо злых вещей.
Они обрабатывают текст и не имеют границ. Если вы #define foo 1
, то любое последующее использование foo
в качестве идентификатора завершится неудачей. Это может привести к странным ошибкам компиляции и трудно обнаруживаемым ошибкам во время выполнения.
Они не принимают аргументы в обычном смысле. Вы можете написать функцию, которая будет принимать два int
значения и возвращать максимальное значение, поскольку аргументы будут оцениваться один раз, а значения будут использоваться после этого. Вы не можете написать макрос, чтобы сделать это, потому что он оценит по крайней мере один аргумент дважды и потерпит неудачу с чем-то вроде max(x++, --y)
.
Есть также распространенные подводные камни. Трудно получить несколько утверждений прямо в них, и они требуют много лишних скобок.
В вашем случае вам нужны скобки:
#define radian2degree(a) (a * 57.295779513082)
должно быть
#define radian2degree(a) ((a) * 57.295779513082)
и вы все еще наступаете на любого, кто пишет функцию radian2degree
в некоторой внутренней области, будучи уверенным, что это определение будет работать в своей собственной области.