Автор Тема: макроопределения с аргументи  (Прочетена 964 пъти)

Apache

  • Напреднали
  • *****
  • Публикации: 106
    • Профил
Здравейте. Уча в момента C и стигнах до Предпроцесор>Макроопределения(макроси)> Макроопределения с аргументи.
Не мога да разбера какъв е смисъла от тези аргументи.
Как се използват, защо изобщо се използват. Сигурно въпроса ми е супер елементарен, но все пак някой ако има желание може да ми обясни '<img'> Мерси предварително.
Активен

  • Гост
макроопределения с аргументи
« Отговор #1 -: Sep 19, 2005, 09:02 »
Разглеждаш макросите като функции и си задаваш въпроса: "Защо ли аджеба са ми нужни аргументи към функциите? И не е ли
Примерен код
void foo(void)
{
  return 42;
}
най-брилятната функция на света '<img'>
Активен

  • Гост
макроопределения с аргументи
« Отговор #2 -: Sep 19, 2005, 09:16 »
Не е най-брилятната функция, компилира се с warning '<img'>
Поправка към горното:
Примерен код

int foo(void)
{
  return 42;
}
Активен

soulcollector

  • Напреднали
  • *****
  • Публикации: 54
    • Профил
макроопределения с аргументи
« Отговор #3 -: Sep 19, 2005, 18:11 »
Ами аз го виждам така:
Имаме например:  
Примерен код
#define  max(A, B)  ((A) > (B) ? (A) : (B))
***
m = max(n, p)
***
x = max(y, z)
***
q = max (a+b, c+d)

След предпроцесора трите реда ще изглеждат така:
Примерен код
m = (n > p)? n : p;
***
x = (y > z) ? y : z;
***
q = ((a+b) > (c+d))? (a+b) : (c+d);


все едно викаш нормална функция

P.S Да благодарим на Brian W. Kernighan и Dennis M. Ritchie за примера и затова, че са го обяснили, така че аз да го разбера.
Активен

This place inside my brain
another kind of pain. (Korn)

semionov

  • Напреднали
  • *****
  • Публикации: 110
    • Профил
макроопределения с аргументи
« Отговор #4 -: Sep 21, 2005, 17:25 »
сигурно вече знаеш че макросите се заместват дословно от препроцесора. а когато имат аргументи, "стойността" на аргумента първо се замества дословно в тялото на макроса, и след това целия получен макрос се замества дословно в програмата и се компилира като сорс. тази възможност придава доста повече гъвкавост и функционалност на макросите, затова е направена.

ето най-яката част - малко по-горе написах стойност в кавички, защото аргумента може да бъде не само константа или променлива, а каквото си поискаш. може да предадеш като аргумент име на тип ако искаш.
Активен