logo
Подбельский Фомин_Программирование на языке СИ_

Отличия макросов от функций.

Отличия макросов от функций. Сравнивая макросы с функциями, заметим, что в отличие от функции, определение которой всегда присутствует в одном экземпляре, тексты, формируемые макросом, вставляются в программу столько раз, сколько раз используется макрос. Обратим внимание на еще одно отличие: функция определена для данных того типа, который указан в спецификации ее параметров и возвращает значение только одного конкретного типа. Макрос пригоден для обработки параметров любого типа, допустимых в выражениях, формируемых при обработке строки замещения. Тип получаемого значения зависит только от типов параметров и от самих выражений. Таким образом, макрос может заменять несколько функций. Например, приведенные макросы max( ) и ABS( ) верно работают для параметров любых целых и вещественных типов, а результат зависит только от типов параметров.

Рис. 3.1. Имитация матрицы с помощью макроопределения и одномерного массива:

А (1,1) соответствует х[5*(1-1)+(1-1)] = = х[0]

А (1,2) соответствует х[5*(1-1)+(2-1)] = = х[1]

А (2,1) соответствует х[5*(2-1)+(1-1)] = = х[5]

А (3,4) соответствует х[5*(3-1)+(4-1)] = = х[13]

Отметим как рекомендацию, что для устранения неоднозначных или неверных использований макроподстановок параметры в строке замещения и ее саму полезно заключать в скобки.

Еще одно отличие: фактические параметры функций - это выражения, а аргументы, вызова макроса – препроцессорные лексемы, разделенные запятыми. Аргументы макрорасширениям не подвергаются.