Страница 1 из 1

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

Добавлено: Сб мар 09, 2013 23:25:47
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

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

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

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

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

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

#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text)

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

Добавлено: Вс мар 10, 2013 00:49:48
Vov123
Goldsmith писал(а): -> - это оператор для доступа к значению поля структуры или объединения


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



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


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