Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Глюк или так и должно быть  (Прочитано 36848 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #30 : 07-09-2006 09:21 » new

Лог рус, а что ты подразумеваешь под словом "работает" Не понял

Препроцессор вообще не работает. Улыбаюсь
Это дирректива - т.е. по русски указание.
При создании директивы #define debug к примеру, при использовании ее затем в коде для ограничения работы кода в разных видах сборки и компиляции, копайлер еще на фазе подготовки кода выкинет все куски? Сама директива лишь укажет что выключить или наоборот подключить к компиляции.

Если мы напишем что-то подобное первому примеру, перед копиляцией будут произведены вычиления, после чего результаты в виде констант попадут в код.

В моем пример билиотечной функции, будет взят и заменен текст DBG_PRINT на текст определенный директивой.

Т.е. все они выполнят лишь некие укзания. По замене, по подключению или по созданию константы в зависимости от определения заданного в makefile-е....

Что-то подобное первому примеру работает у меня сегодня вычисляя уровень дебагиерной информации выдаваемой на принте.

Например есть уровень дебаг1 дебаг2 дебаг3 и дебаг4

1. Выводит всю.
2. Не выводит множественную печать циклических оператций.
3. Не выводит 2 + не выводит информацию постоянного свойства (характеристики найденного оборудования, адреса шин данных и проч.
4. Не выводит 3+ не выводит информацию об странных значениях которые не являются ошибкой. (На этом уровне печать идет только выполняемых крупных действий и результатов типа ОК или код ошибки.

Я задаю начальный уровень.
В коде везде ограничения стоят на копиляцию, а предварительный код ставит значение.

Например.

#if DEBUG_LEVEL < 2
printf();
#endif

в коде этот код будет работать в случае если я определю DEBUG_LEVEL как 1 и не более.
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #31 : 07-09-2006 09:25 » 

Лог рус, а что ты подразумеваешь под словом "работает" Не понял
Гром, о я ждал этого вопроса(чуть позже понял, что, есть не однозначность термина) Улыбаюсь в том смысле что он их не вызывает.
Записан

Странно всё это....
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 07-09-2006 09:55 » 

Serg79, будь ласка, поясни, зачем ты задал вопрос, на который знаешь ответ, если судить по твоим записям потом?

Как бы грамотно ответить на этот вопрос, чтобы обратно не вызвать недопонимание сказаного.
Например такой код приходиться использовать довольно часто:
Код:
#if _WIN32_WINNT == 0x0400
    ...
#elif _WIN32_WINNT == 0x0410
    ...
#elif _WIN32_WINNT == 0x0500
    ...
#else
    #error
#endif
А меня почему то переклинило и я подумал что и так писать можно:
Код:
#define CHIP _Mega32

#if CHIP == _Mega16
    ...
#elif CHIP == _Mega32
    ...
    ...
    ...
#else
    #error Is not chosen type of the microcontroller
#endif
Через полтора часа я понял, что меня просто переклинило и так делать нельзя.
Но вопрос то на форуме был уже задан  Да-да. И тут такое начилось.  В капусту порублю!

Ну и на всякий случай напишу как было сделанно, что бы не осталось ощущения не завершенности
Код:
#define _MEGA_32

#if defined(_MEGA_16)
    ...
#elif defined(_MEGA_32)
    ...
    ...
    ...
#else
    #error Is not chosen type of the microcontroller
#endif

Кстати, LogRus правильно говорит, препроцессор в дерективах #define просто запоминает значение макроса, а при встречи его имени в коде, он просто подставляет его значение. А что там может быть написанно, ему просто по барабану. Ошибки при этом выдает не препроцессор а компилятор. Так что в #define ему считать ни чего не приходиться.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #33 : 07-09-2006 10:55 » 

Serg79, ну дык ты ж не так написал Улыбаюсь ты написал без предварительного дефайна.

Оцени:

#if VALUE == ONE

и

#define VALUE one
#define ONE one

#if VALUE == ONE


Разница в восприятии человека - колоссальна.
Если в первом случае надо объяснять азы, что легче всегда направить к учебнику.
Во втором надо сказать о невозможности сравнения текста.

В любом случае, прошу прощенья за резкость.

Но и ты меня пойми, есть куча вопросов, большинство из которых "Как сделать" без единой попытки понять самому. Отсюда резкость в отношении к глупым копированиям кода из примеров в компилятор Улыбаюсь

В любом случае я не отрицаю правоты ЛогРуса - естественно дефайн подменяет в коде на значение, но я могу написать например так:

#define getvalue(a,b,c,d,e) \
  ( (a+b) / c + (d * e))

В результате в коде могу написать вызов:

int a = getvalue(x,y,z, log bol);

При дебагировании входа в код не будет. Это будет макрос, который сможет вычислять значение выражения.
Т.е. при заранее неизвестных значениях происходит замена не просто текстом, а подмена вычилением записи вызова.
И хоть значения неизвестны, вычисления будут проводится с заданными в рантайм значениями, а не с подменой нулем, как писалось ранее Улыбаюсь

В общем смотрите код читайте Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines