реклама на сайте
подробности

 
 
> #define, вопросы по подстановке
Метценгерштейн
сообщение Jun 29 2015, 13:43
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



немного не ясен момент один:

#define NUM 10
#define SUMM (NUM+8)

результат понятен.

А если поменять местами дефайны?
#define SUMM (NUM+8)
#define NUM 10

может ли препроцессор заглянуть вниз и увидеть, что NUM ниже есть у него? По описанию- не должен, но реально Keil проглатывает это.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Mihey_K
сообщение Aug 28 2015, 14:05
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 28 2015, 17:08
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Mihey_K @ Aug 28 2015, 17:05) *
Препроцессор может считать только предопределенные значения, т.к. выполняется он до прохода компилятором, и понятия не имеет, какие входные данные ему могут быть поданы.

Так
#define TEST (1000000000000ULL / 1000000001)
предопределеннее некуда, а SSerge говорит, что не считает.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 28 2015, 18:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ViKo @ Aug 29 2015, 00:08) *
Так
#define TEST (1000000000000ULL / 1000000001)
предопределеннее некуда, а SSerge говорит, что не считает.

А зачем ему что-то считать в данном случае?
Рассматривайте препроцессор как специализированный текстовый редактор, который работает непосредственно перед компилятором. Это его основное предназначение, т.е. препроцессор получает на входе текст программы, делает в ней текстовые подстановки и выдаёт на выходе тоже текст, с которым потом разбирается уже компилятор.
Ничего считать при этом препроцессору не нужно, просто один фрагмент текста заменяется на другой.

Для проверки включите выдачу результата работы препроцессора в файл, да и посмотрите что там будет.
Кейла у меня нет, могу на примере IAR-а продемонстрировать что препроцессор делает только подстановку, а вычисляет выражение уже компилятор:
Код
//файл main.cpp
void foo()
{
#define TEST (1000000000000ULL / 1000000001)
  SysTick_Config( TEST );
}

Код
//файл main.i  - выход препроцессора
void foo()
{
  SysTick_Config( (1000000000000ULL / 1000000001) );
}

Код
//файл main.lst
     76          void foo()
     77          {
     78          #define TEST (1000000000000ULL / 1000000001)
     79            SysTick_Config( TEST );
   \                     _Z3foov: (+1)
   \   00000000   0xF240 0x30E7      MOVW     R0,#+999
   \   00000004   0x....             B.N      _Z14SysTick_Configj
     80          }


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   #define   Jun 29 2015, 13:43
- - zltigo   QUOTE (Метценгерштейн @ Jun 29 2015, 16:4...   Jun 29 2015, 13:50
|- - CrimsonPig   Цитата(zltigo @ Jun 29 2015, 14:50) Не до...   Jun 29 2015, 14:15
- - SSerge   Цитата(Метценгерштейн @ Jun 29 2015, 20:4...   Jun 29 2015, 14:24
|- - Метценгерштейн   Цитата(SSerge @ Jun 29 2015, 17:24) Препр...   Jun 29 2015, 14:33
|- - CrimsonPig   Цитата(Метценгерштейн @ Jun 29 2015, 15:3...   Jun 29 2015, 14:55
|- - zltigo   QUOTE (Метценгерштейн @ Jun 29 2015, 17:3...   Jun 29 2015, 16:11
- - Mihey_K   Подтверждаю: GCC 4.8 ни единого предупреждения даж...   Jun 29 2015, 14:34
- - Mihey_K   А это уже некорректно: Min(++i, ++j); Подобную зап...   Jun 29 2015, 15:23
- - Mihey_K   Цитатаначинается очевидная зависимость от реализац...   Jun 29 2015, 16:20
- - ViKo   Не уверен, что вопрос уже не задавался, напишу в п...   Aug 28 2015, 10:44
|- - SSerge   Цитата(ViKo @ Aug 28 2015, 17:44) Провери...   Aug 28 2015, 11:47
- - Mihey_K   Все правильно вы сделали, LL для long long, и эта ...   Aug 28 2015, 11:18
|- - ViKo   Цитата(Mihey_K @ Aug 28 2015, 14:18) Все ...   Aug 28 2015, 11:27
- - ViKo   Что же он (препроцессор), то считает, то не считае...   Aug 28 2015, 12:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 17:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016