Макросы в C/С++
Макросы - это препроцессорные "функции" , т.е. лексемы, созданные с помощью директивы #define, которые принимают параметры подобно функциям. После директивы #define указывается имя макроса, за которым в скобках (без пробелов) параметры, отделенные запятыми и определение макроса, отделенное пробелом.
Например:
#define ADD(x,y) x = x + y
если после этого написать:
int a=2; int b=3; ADD(a,b); coutто получим:
a=5 b=3Параметры макросов лучше писать в скобках, хотя это не обязательно, но иногда отсутствие скобок приводит к неожиданным результатам. Вот пример, надеюсь все ясно, объяснять ничего не буду.
#define MACRO1(x) x * x #define MACRO2(x) ( x ) * ( x ) int a =2; int b=3; coutрезультат:
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то
PRINT( a string ); равносильно coutОператор ## используется для контактенации строк, то есть "склеивания" нескольких строк в одну. Например, у вас есть несколько функций с именами MyFirstFunction(), MySecondFunction(), MyThirdFunction() и т.д. Для их вызова можно определить макрос:
#define CALLFUNC(x) My##x##Function()и вызывать функции MyFirstFunction(), MySecondFunction() ,MyThirdFunction() и т.д. макросом CALLFUNC
CALLFUNC(First); CALLFUNC(Second);У многих компиляторов есть ряд встроенных макросов. Наиболее распостраненные - __DATE__ , __TIME__ , __LINE__ , __FILE__ , которые заменяются текущей (на время компиляции) датой, временем, номером строки и именем исходного файла соответственно. Встроенные макросы можно использовать без объявления. Пример:
coutРезультат:
compiled on Sep 52001 23:49:55
Оставить комментарий
Комментарии
#define MACRO2(x) ( x ) * ( x )
int a =2;
int b=3;
cout
результат:
macro 1- 11
macro 2- 25
Как в этом примере мог получиться такой результат? Ведь макрос был только создан, определенны целочисленные переменные и больше ничего. Или я что-то не так понял?
//
#include "stdafx.h"
#include <iostream>
//#define D(mac)(mac * mac);
//#define ra() (rand() % 10)
using namespace std;
struct Node{
char a[10];
Node *pNode;
};
int _tmain(int argc, _TCHAR* argv[])
{
//int mac=0;
// mac=2;
//cout << D(mac);
// cin.get();
//int i;
//cin>>i;
//int*m=new int;
//for (int j=0;j<i;j++)
// m[j] = ra();
//for (int j=0;j<i;j++)
// cout<<m[j];
//cin.get();
//system("pause");
//delete []m ;
Node * s;
s = new Node;
(*s).a[0] = 'a';
(*s).pNode=new Node;
s->pNode->a[0] = 'b';
s->pNode->pNode=new Node;
s->pNode->pNode->a[0] = 'c';
s->pNode->pNode->a[1] = 'd';
Node *pNode = s;
cout << "qqqqqqqq\n";
for (int i = 0; i < 3; i++, pNode = pNode -> pNode)
cout << pNode ->a[0] << endl;
cout << "eeeeeeeee\n";
cout<<'b'<<new Node<<'c'<<endl;
cin.get();
return 0;