![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Волод |
|
|||
|
Unregistered |
Столкнулся недавно с немного странной для меня строкой кода:
#define BUFFER(x,y) *(pBuffer + y * cxBuffer + x), и никак не могу понять, что сие значит? До этого через define мне приходилось определять только константы… На всякий случай вот здесь можно скачать всю программу: suvolod.mail2k.ru/026.rar - она небольшая, всего 11 kb. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Вроде все понятно. Если в коде встречается BUFFER(x,y) то препроцессор меняет на *(pBuffer + y * cxBuffer + x). И все
Т.е.: BUFFER(5,4) == *(pBuffer + 4 * cxBuffer + 5) |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Если говорить как программер, то сия вещ называется Макросом.
-------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
еще добавлю, макросы распространенная вещь. Пример windowsx.h
|
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Макрос, кстати, неграмотный. Что будет, если кто-то напишет BUFFER(5, 3+1) ?
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Волод |
|
|||
|
Unregistered |
Спасибо, поробую покопать - может допру, и у меня еще один встречный вопрос - почему я не могу никак в режиме отладки просмотреть значение BUFFER. Например, возьмем тот-же BUFFER(5,4) - в отладчике (окне Watch) выдает "CXX0017: Error: symbol "BUFFER" not found", а в то-же время *(pBuffer + 4 * cxBuffer + 5) показывает на букву 'd'
|
|||
|
||||
| Волод |
|
|||
|
Unregistered |
А "неграмотный" макрос приводит в своей книге дядя Петзолд
|
|||
|
||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Все ошибаются А макрос действительно неграмотный. Без кавычек. Правильный был бы такой:
Потому что это не переменная. Его вообще во время выполнения не существует. Смысл макрос в том, что перед компиляцией выражение BUFFER(x,y) просто ЗАМЕНЯЕТСЯ в тексте программы на *(pBuffer + y * cxBuffer + x) ЗЫ: Да и вообще я бы избегал таких макросов. -------------------- Да. Именно так. |
||||||
|
|||||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
С другой стороны макросы - это полезно, позволяют сократить некоторый код в два, а то и три раза. Да и в целом программа становиться читабельнее ИМХО.
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
En_t_end
Проблема этого макроса в том, что он привязан к переменным pBuffer и cxBuffer. Т.е. если ты его случайно напишешь там где эти переменные не объявлены (или ещё хуже: объявлены, но имееют другой смысл), то ошибку можешь найти не сразу (а во втором случае далеко не сразу). -------------------- Да. Именно так. |
|||
|
||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
И вообще, дядя Страуструп утверждает, что почти всегда макросы прекрасно заменяются шаблонами и инлайн-функциями, уж в данном случае точно. Кроме того, шаблоны-инлайны 1) typesafe, 2) отлаживаются.
Макросы действительно полезны для замены нескольких предложений, а также для скрытия несущественных моментов и подчеркивания существенных. Например, при блокировках:
можно написать так:
Но вот так, согласитесь, выглядит лучше:
Т.е. в данном случае макрос позволяет убрать с глаз долой ненужные переменные, что другим способом обеспечить невозможно. (Весь код в контексте VC.) Это сообщение отредактировал(а) Earnest - 5.7.2005, 18:47 -------------------- ... |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |