Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
#1

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

17.11.2014, 03:08. Просмотров 303. Ответов 13
Метки нет (Все метки)

Как использовать такие имена макросов(см. пример), только не в директиве 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2014, 03:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование имени макроса в обычных условиях (C++):

Использование ссылок и обычных имен переменных - C++
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто надо понять кое-что. Ссылка - это...

Использование имени типа не допускается - C++
Есть двоичное дерево поиска.И функция добавления,которая работает с помощью вспомогательной функции.Причем должна быть именно такой ,иметь...

IntelliSense: использование имени типа не допускается - C++
Model.h #pragma once class ModelClass { private: ModelClass(void); ~ModelClass(void); static ModelClass* playInstance;

реализация поиска нужного имени в файле и вывод данных, относящихся к этому имени - C++
Доброго времени суток всем! Прошу помощи у более компитентных людей нежели я. Полное задание выглядит так: Разработать программу,...

Отличия методов класса от обычных функций - C++
Что собой представляет метод в классах? Это такое же как и простая функция или что-то другое? Можно простой пример привести какая разница...

Найти разность обычных и десятичных дробей - C++
Написать перегруженные функции и основную программу, которая их вызывает: а) для вычитания десятичных дробей; б) для вычитания...

13
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3969 / 2193 / 553
Регистрация: 18.10.2014
Сообщений: 3,802
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', то они используются по другому: они либо определены, либо не определены. Если макрос не определен, то использование его в обычном коде приведет просто к ошибке. Т.е. такие макросы никакого более-менее осмысленного применения в "обычном" коде не имеют.
2
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 13:34  [ТС] #3
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
зачем вам это нужно
Просто в ходе работы программы мне нужно получить эту информацию, исходя из неё использовать тот или иной тип для приведения.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если макрос не определен, то использование его в обычном коде приведет просто к ошибке
Можно ли как то прям в ходе программы определять определён ли макрос или нет? (я так понимаю что даже по ходу работы можно внедрить этот же #ifdef(он же #if defined как я понял), но можно ли его написать типа if(!_WIN64)?) Вся это тягомотина потому что я в динамическом режиме работаю, и поэтому реал тайм надо..
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
17.11.2014, 13:40 #4
Цитата Сообщение от Izual Посмотреть сообщение
исходя из неё использовать тот или иной тип для приведения.
Зачем? В первом посте уже определены синонимы типов/макросы - их и используйте.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 13:48  [ТС] #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем?
Затем, что надо узнать реал тайм к чему ссылается макрос.

Вопрос был как решить, а не то зачем это мне. Если бы мне нужен был совет "чем заняться от нефиг делать", то уж явно не здесь бы я его задал. Так что не провоцируйте на грубость - не можете ответить по делу - лучше молчите.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
17.11.2014, 13:50 #6
Цитата Сообщение от Izual Посмотреть сообщение
Затем, что надо узнать реал тайм к чему ссылается макрос.
Значения макросов определены на этапе компиляции.
Цитата Сообщение от Izual Посмотреть сообщение
ак что не провоцируйте на грубость
А Вы не провоцируйтесь, а приведите более полный пример. Потому что пока мотивация выглядит нелогичной.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 13:57  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
мотивация выглядит нелогичной.
Потому что не читали:
Цитата Сообщение от Izual Посмотреть сообщение
в динамическом режиме работаю
Я не пишу код руками, я пытаюсь сделать оболочку, через которую будут приводиться и использоваться типы. Именно по этому надо реал тайм, и именно по этому макрос который написан руками(статически) мне не очень подходит, т.к. это вызовет нужду обращения к нему с условием, а это по видимому невозможно в пределах условия макроса. Вот динамическое обычное условие вида if(){}else{} возможно, а динамическое использование макроса - уже не возможно, либо породит ещё рукописные строки, которые я хочу избежать.
0
SatanaXIII
Супер-модератор
Эксперт С++
5638 / 2673 / 252
Регистрация: 01.11.2011
Сообщений: 6,569
Завершенные тесты: 1
17.11.2014, 13:59 #8
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли как то прям в ходе программы определять определён ли макрос или нет?
Нельзя.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 14:12  [ТС] #9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Нельзя.
можно, хотябы так:
C++
1
if(sizeof(void*)==4)
Ну и в общем то я сам ответил на свой вопрос, не так как хотелось бы конешно, т.к. я игнорирую имя макроса, от которого идёт стандартное условие, но изменение условия тоже допустимо.
"Умный в гору не пойдёт, умный гору обойдёт".
0
SatanaXIII
Супер-модератор
Эксперт С++
5638 / 2673 / 252
Регистрация: 01.11.2011
Сообщений: 6,569
Завершенные тесты: 1
17.11.2014, 14:16 #10
Izual, макрос не доживает до хода работы программы. Совсем.
Косвенные какие-то признаки можно выяснить, да, безусловно.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 14:24  [ТС] #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
макрос не доживает до хода работы программы
а как же _MSC_VER, который как сказали можно использовать?.. или есть какое то различие между ними?
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
17.11.2014, 14:28 #12
Цитата Сообщение от Izual Посмотреть сообщение
а как же _MSC_VER, который как сказали можно использовать?.. или есть какое то различие между ними?
Сначала исходники обрабатываются препроцессором, который раскрывает все макросы. Это простая текстовая подстановка. Далее используются уже значения макросов.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
17.11.2014, 14:31  [ТС] #13
0x10, это не ответ, т.к. не объясняет почему _MSC_VER будет существовать, а _WIN64 -нет.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
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
1
17.11.2014, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 14:35
Привет! Вот еще темы с ответами:

Вывод на экран имени переменной(имени файла, и тд.) - C++
Здрасти. Недалече столкнулся с проблемой: надо сравнить два файла по признаку количества содержащихся в них символов и вернуть тот что...

Чем заголовочные файлы отличаются от обычных бибилиотек? C++ - C++
вроди как это одной и тоже, только в стандартной библиотеки C все файлы заголовочные, а в C++ обычные библиотеки... В чем разница между...

функцию которое находит сумму заданных обычных дробей. - C++
Напишите функцию sum с переменным количеством параметров, которое находит сумму заданных обычных дробей...мне обязательно нужно функция с...

Удалить из имен обычных файлов (regular file) все цифры - C++
Удалить из имен обычных файлов (regular file) все цифры.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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