Макросы - это препроцессорные "функции" , т.е. лексемы, созданные с помощью директивы #define, которые принимают параметры подобно функциям. После директивы #define указывается имя макроса, за которым в скобках (без пробелов) параметры, отделенные запятыми и определение макроса, отделенное пробелом.
Например:
#define ADD(x,y) x = x + y
если после этого написать:
int a=2;
int b=3;
ADD(a,b);
cout<<"a= "<<a<<" b= "<<b;
то получим:
a=5 b=3
Параметры макросов лучше писать в скобках, хотя это не обязательно, но иногда отсутствие скобок приводит к неожиданным результатам. Вот пример, надеюсь все ясно, объяснять ничего не буду.
#define MACRO1(x) x * x
#define MACRO2(x) ( x ) * ( x )
int a =2;
int b=3;
cout<<"macro 1- " <<MACRO1(a+b);
cout<<"\nmacro 2- "<<MACRO2(a+b);
результат:
macro 1- 11
macro 2- 25
В первом случае получили 2+3*2+3, то есть 2+6+3=11, а во втором (2+3)*(2+3), т.е. 5*5=25.
Для управления строками в макросах сучествует 2 оператора - оператор взятия в кавычки(#) и оператор контактенации (##). Оператор # берет в кавычки следуючие за ним символы до очередного пробела, например, если объявить так:
#define PRINT(x) cout<< #x
то
PRINT( a string ); равносильно cout<<" a string ";
Оператор ## используется для контактенации строк, то есть "склеивания" нескольких строк в одну. Например, у вас есть несколько функций с именами MyFirstFunction(), MySecondFunction(), MyThirdFunction() и т.д. Для их вызова можно определить макрос:
#define CALLFUNC(x) My##x##Function()
и вызывать функции MyFirstFunction(), MySecondFunction() ,MyThirdFunction() и т.д. макросом CALLFUNC
CALLFUNC(First);
CALLFUNC(Second);
и т.д.
У многих компиляторов есть ряд встроенных макросов. Наиболее распостраненные - __DATE__ , __TIME__ , __LINE__ , __FILE__ , которые заменяются текущей (на время компиляции) датой, временем, номером строки и именем исходного файла соответственно. Встроенные макросы можно использовать без объявления. Пример:
cout<<"Compiled on "<<__DATE__<<" "<<__TIME__ ;
Результат:
compiled on Sep 52001 23:49:55