Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
#1

Сравнение в препроцессоре - C++

21.06.2016, 10:24. Просмотров 726. Ответов 22
Метки нет (Все метки)

нужна условная компиляция
корректна ли такая конструкция (утрирую)
C++
1
2
3
4
5
6
#define A 10
#define B 10
#if A==B
 
..............
#endif
Добавлено через 8 минут
не получилось утрировать
на такую конструкцию Keil не ругается
вот кусок реального кода
где то в заголовочных файлах
C++
1
#define USART3              ((USART_TypeDef *) USART3_BASE)
еще где то
C++
1
2
3
4
5
#define PERIPH_BASE           ((uint32_t)0x40000000)
//....................................
#define APB1PERIPH_BASE       PERIPH_BASE
// ...............................................
#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)

мой файл
C++
1
2
3
4
5
#define USARTDMX USART3
 
#if USARTDMX == USART3
//......................
#endif
ругается собака из за того что указатели?

Добавлено через 7 минут
вот ошибки
C:\STM\project\RadioDMX\MyFile\UART_DMX.c(14): error: #29: expected an expression
#if USARTDMX==USART3
C:\STM\project\RadioDMX\MyFile\UART_DMX.c(14): error: #59: function call is not allowed in a constant expression
#if USARTDMX==USART3
C:\STM\project\RadioDMX\MyFile\UART_DMX.c(14): error: #18: expected a ")"
откуда он функцию взял?
такое ошушенье, что со скобками запутался
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 10:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение в препроцессоре (C++):

"Циклы" на препроцессоре - C++
Хотелось данную информацию включить в блог, но пока не понимаю, как это аккуратно сделать. А потому просто тему помещу на форум, а в блоге...

Сравнение двух предложений по смыслу - C++
Необходимо сравнить два коротких предложения по смыслу. Я так понимаю, нужно семантическое сравнение предложений. Как его можно...

сравнение двух лиц людей - C++
Здравствуйте! подскажите пожалуйста, есть ли в сети готовые библиотеки на Си или С++, которые выдают % схожести одного лица на...

БПФ и сравнение двух генетических последовательностей - C++
Надеюсь, что тут мне помогут. Написал БПФ, но теперь даже в голову не приходит, как мне использовать БПФ для сравнения двух ген....

Сравнение процессов - C++ Builder
Добрый вечер. Уже спрашивал подобное,но теперь немного другая ситуация.Написал программу. Есть мемо и таймер. Через определённые промежутки...

Сравнение скорости - C++ Builder
Вопрос теоретический: что работает быстрее-поразрядное И,ИЛИ (& |),либо логическое И,ИЛИ(&& ||)и в чем их разница?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3157 / 1959 / 218
Регистрация: 13.01.2012
Сообщений: 7,493
21.06.2016, 10:58 #2
ValeryS, у меня вот так вот все работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef int uint32_t;
struct USART_TypeDef {};
 
#define PERIPH_BASE           ((uint32_t)0x40000000)
#define APB1PERIPH_BASE       PERIPH_BASE
#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
#define USART3              ((USART_TypeDef *) USART3_BASE)
#define USARTDMX USART3
 
#if USARTDMX == USART3
#define XXX 123
#else
#define XXX 000
#endif
 
//...
int xxx = XXX; //тут в дебагере я вижу 123
Добавлено через 1 минуту
возможно у вас не определен тип uint32_t или USART_TypeDef
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
21.06.2016, 11:03 #3
Да вроде должно работать. Попробуйте вот так обернуть:
C++
#if (USARTDMX) == (USART3)
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
21.06.2016, 11:08 #4
ValeryS, == в директиве не годится для типов, или вычисляемых на этапе компиляции констант. Почему? Потому что препроцессор отрабатывает до того, как вычислились все эти языковые выражения.
Здесь больше подошли бы языковые средства, в частности шаблоны.

Цитата Сообщение от ValeryS Посмотреть сообщение
мой файл
Можешь объяснить зачем это тебе нужно?
elch10
38 / 21 / 4
Регистрация: 27.04.2015
Сообщений: 164
Завершенные тесты: 2
21.06.2016, 11:10 #5
C++
1
2
3
4
#include<cstdint>
struct USART_TypeDef {};
//......
#define PERIPH_BASE           ((uint32_t)0x40000000) //тут ругается
vxg, у меня ругается
Код
||=== Build: Debug in Test (compiler: GNU GCC Compiler) ===|
error: missing binary operator before token "0x40000000"|
note: in expansion of macro 'PERIPH_BASE'|
note: in expansion of macro 'APB1PERIPH_BASE'|
note: in expansion of macro 'USART3_BASE'|
note: in expansion of macro 'USART3'|
note: in expansion of macro 'USARTDMX'|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|
vxg
Модератор
3157 / 1959 / 218
Регистрация: 13.01.2012
Сообщений: 7,493
21.06.2016, 11:19 #6
elch10, вы четко то что я написал пробовали исполнить? я просто не знаю/не верю что у вас в cstdint
elch10
38 / 21 / 4
Регистрация: 27.04.2015
Сообщений: 164
Завершенные тесты: 2
21.06.2016, 11:21 #7
vxg, вот что у меня
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<cstdint>
 
using namespace std;
struct USART_TypeDef {};
 
#define USART3 (USART_TypeDef* USART3_BASE)
#define PERIPH_BASE ((uint32_t) 0x40000000)
//....................................
#define APB1PERIPH_BASE PERIPH_BASE
// ...............................................
#define USART3_BASE (APB1PERIPH_BASE + 0x4800)
#define USARTDMX USART3
 
#if USARTDMX == USART3
//......................
#endif
int main()
{
 
    return 0;
}
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.06.2016, 15:29  [ТС] #8
Цитата Сообщение от vxg Посмотреть сообщение
возможно у вас не определен тип uint32_t или USART_TypeDef
определен
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Попробуйте вот так обернуть:
пробовал
Цитата Сообщение от DrOffset Посмотреть сообщение
ValeryS, == в директиве не годится для типов, или вычисляемых на этапе компиляции констант.
так нет там констант, одни дефайны
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь больше подошли бы языковые средства, в частности шаблоны.
боюсь, камень не потянет
Цитата Сообщение от DrOffset Посмотреть сообщение
Можешь объяснить зачем это тебе нужно?
могу у микроконтроллера есть от одного до пяти последовательных портов( в зависимости от модификации)
вот и пытаюсь написать написать что то типа библиотеки, чтобы "легким движением руки" мог бы настроить любой порт на любом камне
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
21.06.2016, 15:51 #9
Цитата Сообщение от ValeryS Посмотреть сообщение
так нет там констант, одни дефайны
Как же нет? Константа времени компиляции, полученная в результате вычисления выражения времени компиляции. После раскрытия макросов выражение приобретает вид:
C++
1
(uint32_t)0x40000000 + 0x4800
Макрос результат выражения не знает, т.к. оно посчитается на этапе компиляции. А препроцессор работает до этого. Это же базовая матчасть, собственно.

Цитата Сообщение от ValeryS Посмотреть сообщение
боюсь, камень не потянет
Ну здрасти Камень-то тут причем? Шаблон же - это средство времени компиляции. Тем более такие проверки вообще в бинарный код никогда не попадают. Т.е. главное тут, чтобы компилятор это поддерживал, а на производительность скомпилированного кода это влиять не будет вообще.

Добавлено через 14 минут
ValeryS, ты можешь попытаться заставить его работать, если перенесешь вычисление на плечи препроцессора. Для упрощения:
C++
1
2
3
4
5
6
7
8
9
10
11
#if ((7) == (7))
// работает
#endif
 
#if ((7 + 1) == (7 + 1))
// работает
#endif
 
#if ((1 + 7) == (7 + 1))
// работает
#endif
Т.е. убери все приведения типов, и т.п. Чтобы дать препроцессору посчитать результат.
vxg
Модератор
3157 / 1959 / 218
Регистрация: 13.01.2012
Сообщений: 7,493
21.06.2016, 15:51 #10
DrOffset, как тогда объяснить что у меня вся эта конструкция работает?
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
21.06.2016, 15:57 #11
Цитата Сообщение от vxg Посмотреть сообщение
как тогда объяснить что у меня вся эта конструкция работает?
Можно код целиком, который работает, версию компилятора и хостовой операционной системы?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.06.2016, 16:01  [ТС] #12
Цитата Сообщение от DrOffset Посмотреть сообщение
Макрос результат выражения не знает, т.к. оно посчитается на этапе компиляции. А препроцессор работает до этого. Это же базовая матчасть, собственно.
а как тогда вот это
C++
1
2
3
4
5
6
7
8
9
10
11
12
#define A  10
#define B  A+10
#define C  A+B
#if A==B
#endif
 
#if C==A+B
#warning "Work1"
#endif
#if C==30
#warning "Work2"
#endif
прекрасно вычисляет
C:\STM\project\RadioDMX\MyFile\UART_DMX.c(15): warning: #1215-D: #warning directive: "Work1"
#warning "Work1"
C:\STM\project\RadioDMX\MyFile\UART_DMX.c(18): warning: #1215-D: #warning directive: "Work2"
#warning "Work2"
Цитата Сообщение от DrOffset Посмотреть сообщение
Шаблон же - это средство времени компиляции.
вот я и боюсь что такого накомпилирует да и файлик хочу универсальный, чтобы и на Си и на плюсах тянул
пока вышел из положения так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stm32f10x.h>
 
 
#define DMX__USART 1
//#define DMX__USART 2
//#define DMX__USART 3
 
#if DMX__USART==1
    #define IRQDMX
        #define PortDmx GPIOA
        #define PinDmx_TX GPIO_Pin_9
        #define PinPmx_RX GPIO_Pin_10
        #define USARTDMX USART1
 
    #define  RCC_UART_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE)
        #define  RCC_GPIO_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,ENABLE)
    
 #elif DMX__USART==2
    #define IRQDMX
        #define PortDmx GPIOA
        #define PinDmx_TX GPIO_Pin_2
        #define PinPmx_RX GPIO_Pin_3
        #define USARTDMX USART2
    #define  RCC_UART_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE)
        #define  RCC_GPIO_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,ENABLE)
#elif DMX__USART==3
    #define IRQDMX
        #define PortDmx GPIOB
        #define PinDmx_TX GPIO_Pin_10
        #define PinPmx_RX GPIO_Pin_11
        #define USARTDMX USART3
    #define  RCC_UART_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB1Periph_USART3,ENABLE)
        #define  RCC_GPIO_ENABLE()   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB ,ENABLE)
#else 
#error "uncorrect USART"
 
#endif
ввел еще один дефайн

но просто интересно это Keil дурит или не стандартно все
у кого то ведь работает

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. убери все приведения типов, и т.п. Чтобы дать препроцессору посчитать результат.
не могу, это базовый файл, от производителя микроконтроллера
изменив здесь, получу приключений в других местах
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
21.06.2016, 16:10 #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ValeryS Посмотреть сообщение
а как тогда вот это прекрасно вычисляет
Ну препроцессор может оперировать вычислениями в целых числах, если это просто константы, без типизации и т.п. Как только в дело входит типизация, то лавочка сворачивается Типизация - дело компилятора.
Посмотри, я там дополнил пост насчет этого.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
ввел еще один дефайн
В принципе самый нормальный вариант, если страшно связываться с С++.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
но просто интересно это Keil дурит или не стандартно все
Ну вот три распространенных компилятора, короткие примеры:
1) http://rextester.com/XOK79465
2) http://rextester.com/EMBZ88902
3) http://rextester.com/AOGNP50134
Ни один не работает.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.06.2016, 16:11  [ТС] #14
Цитата Сообщение от DrOffset Посмотреть сообщение
Как только в дело входит типизация, то лавочка сворачивается Типизация - дело компилятора.
не знал
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
21.06.2016, 16:12 #15
Причем пишет же ясно:
token is not a valid binary operator in a preprocessor subexpression
О чем и я речь веду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 16:12
Привет! Вот еще темы с ответами:

Сравнение объектов? - C++ Builder
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...

Сравнение папок - C++ Builder
Ребят, можно ли так делать? if((Edit1-&gt;Text!=Edit3-&gt;Text)&amp;(CheckBox2-&gt;Checked==false)) { Label6-&gt;Caption=&quot;Размеры папок не...

Сравнение дат - C++ Builder
Добрый день. Существует ли функция для сравнения переменных типа DateTime? Т.е. у меня есть массив DateTime a и переменная DateTime b....

@media в препроцессоре Sass - HTML, CSS
Непонятно, как записать корректно запрос в Sass (не в Scss): @media screen and (min-width: 320px) and (max-width: 580px) Тяжело...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.06.2016, 16:12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru