Здравствуйте уважаемые форумчане. Разбираюсь как сделать меню на структурах:
http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=2178&showinfo=1
Есть пара непонятных моментов:
1 - в файле Menu.h есть строки такого вида:
#define PREVIOUS *((Menu_Item*)pgm_read_word(&CurrMenuItem->Previous))
что делает команда "->" ?
2 - ниже идет такая конструкция:
#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text) \
extern Menu_Item Next; \
extern Menu_Item Previous; \
extern Menu_Item Parent; \
extern Menu_Item Sibling; \
Menu_Item Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Sibling, (FuncPtr)SelectFunc, (FuncPtr)EnterFunc, { Text }}
в конце каждой строки символ "\". как этот символ организует эту конструкцию? он работает как то похоже на скобки {}? То есть я не пойму как работает вся конструкция #define MAKE_MENU
Пара непонятных моментов по языку СИ
- Goldsmith
- Опытный кот
- Сообщения: 736
- Зарегистрирован: Пн янв 10, 2011 03:06:36
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Пара непонятных моментов по языку СИ
1. -> - это оператор для доступа к значению поля структуры или объединения. Если a - указатель на структуру, а b - поле этой структуры, то в целом конструкция a->b означает "поле b структуры, на которую указывает a". Другими словами, то же самое, что и (*a).b, только, по мнению создателей языка, нагляднее.
2. Backslash (литера "\") "экранирует" следующую за ним литеру, меняя ее действие. В данном случае "\" в конце строки "экранирует" его, не давая тем самым завершить макроопределение. Это позволяет "растянуть" макрос на несколько строк, что мы и видим в примере.
Если убрать "\" в конце первой строки, получим просто пустое макроопределение:
2. Backslash (литера "\") "экранирует" следующую за ним литеру, меняя ее действие. В данном случае "\" в конце строки "экранирует" его, не давая тем самым завершить макроопределение. Это позволяет "растянуть" макрос на несколько строк, что мы и видим в примере.
Если убрать "\" в конце первой строки, получим просто пустое макроопределение:
Код: Выделить всё
#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text)Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Пара непонятных моментов по языку СИ
Goldsmith писал(а): -> - это оператор для доступа к значению поля структуры или объединения
Добавлю,что при косвенном методе (используя указатель),при прямом используется точка "."
Goldsmith писал(а):"экранирует"
Ишь как всё закручено.
Макроопределение должно быть записано в одну строку,если не помещается используется знак переноса "\",как в русском языке "-".