Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Apache в Sep 17, 2005, 22:36



Титла: макроопределения с аргументи
Публикувано от: Apache в Sep 17, 2005, 22:36
Здравейте. Уча в момента C и стигнах до Предпроцесор>Макроопределения(макроси)> Макроопределения с аргументи.
Не мога да разбера какъв е смисъла от тези аргументи.
Как се използват, защо изобщо се използват. Сигурно въпроса ми е супер елементарен, но все пак някой ако има желание може да ми обясни ;) Мерси предварително.


Титла: макроопределения с аргументи
Публикувано от: в Sep 19, 2005, 09:02
Разглеждаш макросите като функции и си задаваш въпроса: "Защо ли аджеба са ми нужни аргументи към функциите? И не е ли
Примерен код
void foo(void)
{
  return 42;
}
най-брилятната функция на света :)


Титла: макроопределения с аргументи
Публикувано от: в Sep 19, 2005, 09:16
Не е най-брилятната функция, компилира се с warning :(
Поправка към горното:
Примерен код

int foo(void)
{
  return 42;
}


Титла: макроопределения с аргументи
Публикувано от: soulcollector в 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 за примера и затова, че са го обяснили, така че аз да го разбера.


Титла: макроопределения с аргументи
Публикувано от: semionov в Sep 21, 2005, 17:25
сигурно вече знаеш че макросите се заместват дословно от препроцесора. а когато имат аргументи, "стойността" на аргумента първо се замества дословно в тялото на макроса, и след това целия получен макрос се замества дословно в програмата и се компилира като сорс. тази възможност придава доста повече гъвкавост и функционалност на макросите, затова е направена.

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