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

#define

Добавлено: Пн июл 25, 2016 17:46:36
shevelev_es
Прочитал инфу про #define. Так же прочитал про использование совместно #ifndef, #define и #endif для исключения повторов кода и вывода ошибки компилятором. Но ни как не могу понять что значит этот #define например в заголовочных файлах.

Например в alcd.h файле все логично и понятно

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

/************************************************** 
  CodeVisionAVR C Compiler V2.04.9+
  (C) 1998-2010 Pavel Haiduc, HP InfoTech S.R.L.

  Universal alphanumeric LCD driver library
  for the HD44780 LCD controller

  Supports both ATxmega and non-ATxmega devices
**************************************************/


#ifndef _LCDX_INCLUDED_
#define _LCDX_INCLUDED_

void _lcd_write_data(unsigned char data);
/* read a byte from the LCD character generator or display RAM */
unsigned char lcd_read_byte(unsigned char addr);
/* write a byte to the LCD character generator or display RAM */
void lcd_write_byte(unsigned char addr, unsigned char data);
// set the LCD display position  x=0..39 y=0..3
void lcd_gotoxy(unsigned char x, unsigned char y);
// clear the LCD
void lcd_clear(void);
void lcd_putchar(char c);
// write the string str located in SRAM to the LCD
void lcd_puts(char *str);
// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str);
// write the string str located in EEPROM to the LCD
void lcd_putse(char eeprom *str);
// initialize the LCD controller
void lcd_init(unsigned char lcd_columns);

#pragma library alcd.lib

#endif
Но например в файле mega8.h просто стоит #define и какое-то значение. Привел на картинке.

Изображение

Re: #define

Добавлено: Пн июл 25, 2016 17:50:53
Аlex
Т.е. вот этого ответа :
WiseLord писал(а):Так и понимайте. Определён макрос с таким именем.
в другой теме недостаточно было ? Нужно ещё одну тему создать ? :facepalm:

Re: #define

Добавлено: Пн июл 25, 2016 18:01:12
shevelev_es
Там тема была создана. Только одну создал. Если чем обидел извини.
Как понять это макрос.
Макрос создается например

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

#define DBL_DIG 15 
#define FLT_DIG 6  
#define LDBL_DIG 18 
или так

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

#define SQUARE(X) Х*Х 
все понятно, что код делает

а просто

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

#define __POWERDOWN_SUPPORTED__
что дает????

Re: #define

Добавлено: Пн июл 25, 2016 18:09:44
Аlex
shevelev_es писал(а):все понятно, что код делает
И что же он делает, этот код ? Расскажите нам ?

Re: #define

Добавлено: Пн июл 25, 2016 18:39:03
ARV
вы заблуждаетесь, если думаете, что макрос в Си что-то делает.
на самом деле он не делает ничего! делает препроцессор, а макрос указывает ему, что надо сделать.
например, у вас есть текстовый файл в котором вы делаете "найти и заменить" слово "ВАСЯ" на "ПЕТЯ ДУРАК" - это действие вам понятно? так вот, препроцессор делает точно то же самое: он ищет МАКРОС в тексте и заменяет его на ЗНАЧЕНИЕ МАКРОСА. Если вы вместо "ПЕТЯ ДУРАК" введете пробел, то после поиска и замены из текста у вас просто пропадет слово "ВАСЯ". то же самое и с макросом, для которого отсутствует значение.

разница в том, что макрос без значения СУЩЕСТВУЕТ, и его существование можно проверить директивой #ifdef или #ifndef. такие макросы могут выполнять функции "переключателей" где-то далее по коду - если они существуют, будет компилироваться один участок кода, если не существуют - другой. вот и все.

Re: #define

Добавлено: Пн июл 25, 2016 19:16:46
shevelev_es
ARV, спасибо тебе огромное.
#define Вася Петя
Я понимаю, что по сути это просто замена одного на другое ("Васю на Петю"). Тут у меня и возник вопрос если есть одно (вася), но нет (пети)
#define __POWERDOWN_SUPPORTED__ примерно #define Вася то, что тогда заменять???

Я надеюсь правильно тебя понял: в этом случает мы просто определили __POWERDOWN_SUPPORTED__ ("Васю") и где-то в коде при проверки
#ifdef __POWERDOWN_SUPPORTED__ выполнится одно, иначе другое?

Re: #define

Добавлено: Пн июл 25, 2016 19:25:49
ARV
shevelev_es писал(а):выполнится одно, иначе другое?
совершенно верно