Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Макросы в 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 

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
100K
27 сентября 2018 года
Darth Joke
0 / / 27.09.2018
+4 / -0
Мне нравитсяМне не нравится
27 сентября 2018, 13:59:51
#define MACRO1(x) x * x
#define MACRO2(x) ( x ) * ( x )
int a =2;
int b=3;
cout
результат:

macro 1- 11
macro 2- 25

Как в этом примере мог получиться такой результат? Ведь макрос был только создан, определенны целочисленные переменные и больше ничего. Или я что-то не так понял?
2.
99K
27 декабря 2017 года
Даниил Рязанов
0 / / 27.12.2017
+2 / -0
Мне нравитсяМне не нравится
27 декабря 2017, 17:39:39
"контактенация", ну да все верно от слова "контакт".
3.
96K
28 октября 2015 года
Глеб Велиховский
0 / / 28.10.2015
+4 / -0
Мне нравитсяМне не нравится
28 октября 2015, 10:23:23
Пожалуйста - уберите из текста опечатки ;_[
4.
94K
09 декабря 2014 года
Богдан Маленький
0 / / 09.12.2014
+3 / -1
Мне нравитсяМне не нравится
9 декабря 2014, 20:55:47
Код:
// ConsoleApplication20.cpp: определяет точку входа для консольного приложения.

//



#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;
5.
Аноним
+61 / -8
Мне нравитсяМне не нравится
3 апреля 2006, 12:05:19
Не гоните, ребята. Лично мне была нужна обзорная инфа по макросам - я ее нашел. Автору спасибо, что потратил свое время. А сильноученые комментарии тут никому не нужны, кроме вас самих.
6.
Аноним
+41 / -7
Мне нравитсяМне не нравится
2 апреля 2006, 04:28:50
Да ладно. Статьи не только для гуру пишутся. Сами небось научились кодить с момента рождения.
7.
Аноним
+20 / -12
Мне нравитсяМне не нравится
20 января 2006, 18:54:33
Да... Еще и с ошибками.... :(
8.
Аноним
+4 / -34
Мне нравитсяМне не нравится
15 января 2006, 19:30:36
Ой! Меня прямо обкатило потоком инфы! 8)
9.
Аноним
+6 / -53
Мне нравитсяМне не нравится
19 сентября 2005, 12:17:24
М-да, а мне кажеться этому в школе учат, а тут оказываеться можно целую "статью" накатать. Уберите сылку не позорьтесь!
10.
Аноним
+9 / -49
Мне нравитсяМне не нравится
6 мая 2005, 13:09:46
Если это называется статья, то... я помолчу. А вообще мне кажется, что такие материалы, просто засоряют сайт.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог