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

 
 
> #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
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 17)
Mihey_K
сообщение Aug 28 2015, 14:05
Сообщение #16


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

Группа: Участник
Сообщений: 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
Сообщение #17


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

Группа: Модераторы
Сообщений: 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
Сообщение #18


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

Группа: Свой
Сообщений: 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

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

 


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


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