Пара непонятных моментов по языку СИ

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
kvark85
Встал на лапы
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков
Контактная информация:

Пара непонятных моментов по языку СИ

Сообщение kvark85 »

Здравствуйте уважаемые форумчане. Разбираюсь как сделать меню на структурах:
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: Пара непонятных моментов по языку СИ

Сообщение Goldsmith »

1. -> - это оператор для доступа к значению поля структуры или объединения. Если a - указатель на структуру, а b - поле этой структуры, то в целом конструкция a->b означает "поле b структуры, на которую указывает a". Другими словами, то же самое, что и (*a).b, только, по мнению создателей языка, нагляднее.

2. Backslash (литера "\") "экранирует" следующую за ним литеру, меняя ее действие. В данном случае "\" в конце строки "экранирует" его, не давая тем самым завершить макроопределение. Это позволяет "растянуть" макрос на несколько строк, что мы и видим в примере.

Если убрать "\" в конце первой строки, получим просто пустое макроопределение:

Код: Выделить всё

#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text)
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Пара непонятных моментов по языку СИ

Сообщение Vov123 »

Goldsmith писал(а): -> - это оператор для доступа к значению поля структуры или объединения


Добавлю,что при косвенном методе (используя указатель),при прямом используется точка "."



Goldsmith писал(а):"экранирует"


Ишь как всё закручено.
Макроопределение должно быть записано в одну строку,если не помещается используется знак переноса "\",как в русском языке "-".
Ответить

Вернуться в «Разные вопросы по МК»