В C макрос - это директива препроцессора, которая создает ярлык, часто однострочное выражение для вставки в другое место кода. Макросы могут сделать код более читабельным, но они могут иметь отрицательный эффект при неуклюжей реализации.
В следующем коде вы видите вековую функцию max () :
#include <stdio.h> int max (x, y) { если (х> у) Возвращение (х); еще возвращать (у); } int main () { int a, b; printf («Введите два числа через пробел:»); scanf ("% d% d", & a, & b); printf ("% d больше \ n", max (a, b)); Возвращение (0); }
Вот пример прогона:
Input two numbers separated by a space: 26 88
88 is greater
Макс () функция также может быть записано:
int max (x, y) { return (x> y? x: y); }
Выход такой же. Тем не менее, кое-что о функции из одной строки кажется мне странным. В примере этого урока функция не обязательна, но предполагается, что max () является частью более длинной программы, в которой она вызывается из нескольких частей кода. Даже тогда однострочная функция выглядит довольно глупо.
В качестве альтернативы, без особого преимущества, так или иначе, вы можете объявить max () как макрос. Используйте #define
директиву препроцессора в начале файла исходного кода:
#define max(x,y) x > y ? x : y
Чтобы создать этот макрос, я выхватил функцию max () , удалив скобки и точку с запятой в конце оператора. Остается макрос max () , который принимает два аргумента x
и y
. Аргументы, развернутые в тернарный оператор, показаны выше: сам макрос имеет значение max (x, y) (без пробелов), а все остальное в строке является определением макроса, что будет вставлено в код, в котором появляется макрос ,
Помните: многие «функции», которые вы регулярно используете в C, определяются как макросы, такие как getchar () и putchar () . Тем не менее, они выглядят и работают как функции в коде. Технически это макросы.
На практике я определяю свои макросы как ВСЕ КАПСЫ, точно так же как определенные константы. Таким образом, я знаю, что «функция» - это действительно макрос. Кроме того, я чувствую, что в любом другом, читающем мой код, подсказывает, что MAX () - это макрос, а не функция, на которую они должны охотиться в других местах исходного кода.
В уроке следующей недели я использую различные макросы для выполнения математических операций на двоичном уровне. Именно эта всепоглощающая радость заставляет меня ценить язык Си.