Рассмотрим следующий код:
НАЧАЛОЦЕЛОЕ n = 5;
PRINT ("Значение n равно% d"; n);
КОНЕЦ
Приведенный выше код не является допустимым кодом C.
Но следующий код действителен:
// Пример1.c#define START int main ()
#define END
#define INTEGER int
# определить ПЕЧАТЬ (A, B) printf (A, B)
НАЧАЛО
ЦЕЛОЕ n = 5;
PRINT ("Значение n равно% d"; n);
КОНЕЦ
Перед компиляцией макросы START, INTEGER, PRINT и END были заменены их значениями, и код становится действительным кодом C. Мы можем проверить это с помощью следующей команды:
gcc -E Пример1.cЭта команда отобразится после раскрытия всех макросов.
Теперь мы увидим разные типы макросов:
1. Макросы, подобные объекту:
Синтаксис:
#define macro_name macro_value- Макрос всегда начинается с #define
- macro_name - определяемое пользователем имя макроса
- macro_value - значение макроса. Это может быть что угодно, но одна строка и тело макроса заканчиваются концами этой строки. Не требует точки с запятой (;) в конце. Космос тоже считается.
Если макрос занимает более одной строки, мы можем сделать это следующим образом:
#define macro_name macro_value1 \macro_value2 \
macro_value3
#define MAX 200
Этот макрос выглядит как объект данных, поэтому макрос этого типа называется объектно-подобным макросом.
// Пример2.c//#включать
#define MAX 200
int main ()
printf ("МАКСИМАЛЬНОЕ значение:% d", МАКС);
возврат 0;
В Пример 2.c, МАКС это макрос. Из вывода мы видим, что МАКСИМУМ заменяется его значением 200.
2. Функциональные макросы:
Синтаксис:
#define macro_name () macro_valuemacro_name это определяемое пользователем имя макроса. Пара скобок ставится после macro_name. Между macro_name и скобки. Мы также можем передавать аргументы в этом типе макросов.
#define add (x, y) x + yЭтот макрос выглядит как вызов функции, поэтому этот тип макроса называется макросом, подобным функции.
// Example3.c#define add (x, y) x + y
int main ()
int a;
float b;
а = добавить (4,5);
b = добавить (2.5,3.6)
возврат 0;
В Example3.c, мы видели, что в отличие от функции C, макрос заменяет только код аргументами, не вычисляя его. Итак, мы можем передавать разные типы данных, используя один и тот же макрос.
Если мы поместим пробел между именем макроса и круглыми скобками, он будет работать так же, как объектный макрос. Ниже приведен пример C, иллюстрирующий это.
// Example4.c#define add (x, y) x + y
int main ()
int a;
float b;
а = добавить (4,5);
b = добавить (2.5,3.6)
В примере 4.c, мы видели, что макрос add заменяется на (x, y) x + y . То же, что и объектный макрос.
3. Макрос для вставки токена:
В языке C для вставки токена используется оператор ##. Используя этот оператор, мы можем объединить два действительных токена в один действительный токен.
Пример:
#define MARGE (x, y) x ## y
int main ()
int число = МАРЖ (52,34);
возврат 0;
Если мы попытаемся вставить токен, который не создает действительный токен, компилятор C выдает ошибку или предупреждение.
// Пример6.c#define MARGE (x, y) x ## y
int main ()
int число = МАРЖ (52, +);
возврат 0;
В Пример6.c, у нас есть сообщение об ошибке, потому что после комбинации двух токенов мы получаем недопустимый токен '52 + '.
4. Макрос для натягивания:
В языке C оператор # используется для преобразования параметра макроса в строковую константу. Когда оператор # предшествует параметру макроса, параметр преобразуется в строковый литерал. Строкование может использоваться для макросов объектно-подобных и функциональных.
Пример:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Привет, мир));
возврат 0;
В Пример7.c у нас есть строка «Hello World» с помощью макроса STRINGIZING.
Заключение:
В этой статье рассказывались обо всех типах макроподобных Объектные макросы, Функциональные макросы, Макрос для вставки токена, Макрос для натягивания и макрос для натягивания на языке C. Теперь мы можем без всяких сомнений использовать макрос в нашей программе на C.