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

Использование имени макроса в обычных условиях - C++

Восстановить пароль Регистрация
 
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 03:08     Использование имени макроса в обычных условиях #1
Как использовать такие имена макросов(см. пример), только не в директиве define, а в обычных условиях кода?(имеется в виду в виде обычных операторов if(){..}else{..})
C++
1
2
3
4
5
#if defined(_WIN64) 
 typedef __int64 INT_PTR; 
#else 
 typedef int INT_PTR;
#endif
C++
1
2
3
4
5
#if (_MSC_VER >= 1300)
 #define POINTER_64 __ptr64
#else
 #define POINTER_64
#endif
C++
1
2
3
4
5
#ifdef _WIN64
 typedef UHALF_PTR *PUHALF_PTR;
#else
 typedef UHALF_PTR *PUHALF_PTR;
#endif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2014, 03:08     Использование имени макроса в обычных условиях
Посмотрите здесь:

C++ функцию которое находит сумму заданных обычных дробей.
необходимо переделать программу, чтобы вместо обычных массивов были динмические C++
Решение обычных деференциальных уравнений методами Ейлера, Рунге-Кутта C++
Отличия методов класса от обычных функций C++
Вывод на экран имени переменной(имени файла, и тд.) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,668
17.11.2014, 05:29     Использование имени макроса в обычных условиях #2
Цитата Сообщение от Izual Посмотреть сообщение
Как использовать такие имена макросов
Не совсем понимаю, зачем вам это нужно. Все макросы - константы времени компиляции, поэтому если они и употребимы в рамках обычных логических, арифметических или каких других выражений выражений, они все равно должны "сокращаться" компилятором. Иногда это бывает нужно, но очень редко.

В любом случае, использовать в обычных выражениях можно только макросы, которые всегда определены и всегда замещаются на какое-то значение. Например, '_MSC_VER' как раз такой макрос. Никто вам не запрещает писать прямо в коде

C++
1
2
3
4
5
6
if (_MSC_VER >= 1300)
{
}
else
{
}
хоть для '_MSC_VER' в этом и нет особого смысла (лучше было воспользоваться '#if'). 'RAND_MAX', 'INT_MAX', 'CHAR_BIT' и т.п. как раз такие макросы.

Что же касается макросов типа '_WIN64', то они используются по другому: они либо определены, либо не определены. Если макрос не определен, то использование его в обычном коде приведет просто к ошибке. Т.е. такие макросы никакого более-менее осмысленного применения в "обычном" коде не имеют.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 13:34  [ТС]     Использование имени макроса в обычных условиях #3
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
зачем вам это нужно
Просто в ходе работы программы мне нужно получить эту информацию, исходя из неё использовать тот или иной тип для приведения.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если макрос не определен, то использование его в обычном коде приведет просто к ошибке
Можно ли как то прям в ходе программы определять определён ли макрос или нет? (я так понимаю что даже по ходу работы можно внедрить этот же #ifdef(он же #if defined как я понял), но можно ли его написать типа if(!_WIN64)?) Вся это тягомотина потому что я в динамическом режиме работаю, и поэтому реал тайм надо..
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.11.2014, 13:40     Использование имени макроса в обычных условиях #4
Цитата Сообщение от Izual Посмотреть сообщение
исходя из неё использовать тот или иной тип для приведения.
Зачем? В первом посте уже определены синонимы типов/макросы - их и используйте.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 13:48  [ТС]     Использование имени макроса в обычных условиях #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем?
Затем, что надо узнать реал тайм к чему ссылается макрос.

Вопрос был как решить, а не то зачем это мне. Если бы мне нужен был совет "чем заняться от нефиг делать", то уж явно не здесь бы я его задал. Так что не провоцируйте на грубость - не можете ответить по делу - лучше молчите.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.11.2014, 13:50     Использование имени макроса в обычных условиях #6
Цитата Сообщение от Izual Посмотреть сообщение
Затем, что надо узнать реал тайм к чему ссылается макрос.
Значения макросов определены на этапе компиляции.
Цитата Сообщение от Izual Посмотреть сообщение
ак что не провоцируйте на грубость
А Вы не провоцируйтесь, а приведите более полный пример. Потому что пока мотивация выглядит нелогичной.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 13:57  [ТС]     Использование имени макроса в обычных условиях #7
Цитата Сообщение от 0x10 Посмотреть сообщение
мотивация выглядит нелогичной.
Потому что не читали:
Цитата Сообщение от Izual Посмотреть сообщение
в динамическом режиме работаю
Я не пишу код руками, я пытаюсь сделать оболочку, через которую будут приводиться и использоваться типы. Именно по этому надо реал тайм, и именно по этому макрос который написан руками(статически) мне не очень подходит, т.к. это вызовет нужду обращения к нему с условием, а это по видимому невозможно в пределах условия макроса. Вот динамическое обычное условие вида if(){}else{} возможно, а динамическое использование макроса - уже не возможно, либо породит ещё рукописные строки, которые я хочу избежать.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
17.11.2014, 13:59     Использование имени макроса в обычных условиях #8
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли как то прям в ходе программы определять определён ли макрос или нет?
Нельзя.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 14:12  [ТС]     Использование имени макроса в обычных условиях #9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Нельзя.
можно, хотябы так:
C++
1
if(sizeof(void*)==4)
Ну и в общем то я сам ответил на свой вопрос, не так как хотелось бы конешно, т.к. я игнорирую имя макроса, от которого идёт стандартное условие, но изменение условия тоже допустимо.
"Умный в гору не пойдёт, умный гору обойдёт".
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
17.11.2014, 14:16     Использование имени макроса в обычных условиях #10
Izual, макрос не доживает до хода работы программы. Совсем.
Косвенные какие-то признаки можно выяснить, да, безусловно.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 14:24  [ТС]     Использование имени макроса в обычных условиях #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
макрос не доживает до хода работы программы
а как же _MSC_VER, который как сказали можно использовать?.. или есть какое то различие между ними?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.11.2014, 14:28     Использование имени макроса в обычных условиях #12
Цитата Сообщение от Izual Посмотреть сообщение
а как же _MSC_VER, который как сказали можно использовать?.. или есть какое то различие между ними?
Сначала исходники обрабатываются препроцессором, который раскрывает все макросы. Это простая текстовая подстановка. Далее используются уже значения макросов.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
17.11.2014, 14:31  [ТС]     Использование имени макроса в обычных условиях #13
0x10, это не ответ, т.к. не объясняет почему _MSC_VER будет существовать, а _WIN64 -нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 14:35     Использование имени макроса в обычных условиях
Еще ссылки по теме:

Чем заголовочные файлы отличаются от обычных бибилиотек? C++ C++
Как сделать динамические массивы вместо обычных? Используя функции C++
C++ Найти разность обычных и десятичных дробей

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

Или воспользуйтесь поиском по форуму:
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.11.2014, 14:35     Использование имени макроса в обычных условиях #14
Цитата Сообщение от Izual Посмотреть сообщение
это не ответ, т.к. не объясняет почему _MSC_VER будет существовать, а _WIN64 -нет.
Макросов в рантайме нет - это уже было сказано. Есть разница между "макрос определен" и "макрос определен с некоторым значением".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Может быть определен и в командной строке
#define _WIN64
 
...
if (_WIN64)
// После обработки препроцессором:
if ()
 
#define _MSC_VER 42
if (_MSC_VER)
// после препроцессинга
if (42)
 
// Но для препроцессора оба условия истинны:
#ifdef _WIN64
#endif
 
#ifdef _MSC_VER
#endif
Yandex
Объявления
17.11.2014, 14:35     Использование имени макроса в обычных условиях
Ответ Создать тему
Опции темы

Текущее время: 11:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru