Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.41.214] |
|
Страницы: (4) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет!
Понадобилось для себя написать ряд условий препроцессора для определения, скажем так, "целей" для различных тулчейнов на базе CGG/Clang. Вот тут я определяю OS из списка: Windows, Linux, Mac OS X, FreeBSD, Android, Solaris, SunOS, QNX. Остальные операционные системы пока не интересуют. #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #define OS_NAME "Windows" #elif defined(__linux__) #define OS_NAME "Linux" #elif defined(__APPLE__) || defined(__MACH__) #define OS_NAME "Mac OS X" #elif defined(__FreeBSD__) #define OS_NAME "FreeBSD" #elif defined(__ANDROID__) #define OS_NAME "Android" #elif defined(sun) || defined(__sun) #if defined(__SVR4) || defined(__svr4__) #define OS_NAME "Solaris" #else #define OS_NAME "SunOS" #endif #elif defined(__QNX__) || defined(__QNXNTO__) #define OS_NAME "QNX" #else #error Unknown OS #endif Просьба проверить хотя бы поверхностно правильность. Самостоятельно мне чекать под все перечисленные OS нет возможности. Ну с миру по нитке, как говорится А вот с разрядностью нашел решение на SO: #if INTPTR_MAX == INT64_MAX #define BIT_NAME "x64" #else #define BIT_NAME "x32" #endif На сколько оно корректно? На сколько оно корректно для прочих архитектур, кроме i686 и x86_64. |
Сообщ.
#2
,
|
|
|
JoeUser
А зачем вы всё с ног на голову поставили? |
Сообщ.
#3
,
|
|
|
Цитата Pavia @ А зачем вы всё с ног на голову поставили? В смылсе? |
Сообщ.
#4
,
|
|
|
Цитата Pavia @ А зачем вы всё с ног на голову поставили? Так и не дождался объяснения вопроса! Скрытый текст |
Сообщ.
#5
,
|
|
|
1. В первой строке, наверное, опечатка, и должно быть в одном из вариантов _WIN64.
2. __OS2__ для OS/2 :-) Добавлено С разрядностью: 1. Похрамывает для случая 16-битных систем. 2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю). |
Сообщ.
#6
,
|
|
|
Цитата Славян @ 1. В первой строке, наверное, опечатка, и должно быть в одном из вариантов _WIN64. Точно! Цитата Славян @ 2. __OS2__ для OS/2 :-) Эх ... такая система когда то была!!! Я с 3.62 версии ее юзать начинал. Лет 5 на ней сидел. Цитата Славян @ 1. Похрамывает для случая 16-битных систем. Не, не нужны они мне. Цитата Славян @ Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю). Хм ... надо выяснить. Пасип, Славян! |
Сообщ.
#7
,
|
|
|
Лучше начать отсюда: https://sourceforge.net/p/predef/wiki/Home/
|
Сообщ.
#8
,
|
|
|
Flex Ferrum, по поводу OS - сверил, у меня все верно.
А вот по поводу: Цитата Славян @ 2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю). Славян меня немного в тупик поставил. |
Сообщ.
#9
,
|
|
|
Цитата JoeUser @ А вот по поводу: Лучше смотреть на макросы из того же справочника. Размер int'а может не быть равным 64 да x64-платформах. Зависит от компилятора и флагов. |
Сообщ.
#10
,
|
|
|
Цитата Славян @ 2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю). Если вики не врет: |
Сообщ.
#11
,
|
|
|
Цитата Flex Ferrum @ Лучше смотреть на макросы из того же справочника. Что-то там про разрядность не нахожу Цитата Flex Ferrum @ Размер int'а может не быть равным 64 да x64-платформах. Зависит от компилятора и флагов. А если вот так: #if (INTPTR_MAX == INT64_MAX) || defined(__LP64__) || defined(_LP64) #define BIT_NAME "x64" #else #define BIT_NAME "x32" #endif ??? |
Сообщ.
#12
,
|
|
|
Сообщ.
#13
,
|
|
|
Не не не - это тупик! Выводить битность из модели CPU - хреновое решение, имхо! Представь, что выйдет какой-нить очередной камень, для его идентификации потребуется свой макро, которого нет в том чудо списке - труба. Но всеж, думаю, последнее мое решение правильное - из заголовком используемого тулчейна! Добавлено Цитата Flex Ferrum @ Размер int'а может не быть равным 64 да x64-платформах. Стоп стоп стоп!!! Условие "INTPTR_MAX == INT64_MAX" говорит совсем о другом. А именно, что максимальный размер целого, могущего хранить указатель - равен предопределенной константе размера целого в 64 бита. Таким образом, может и __LP64__ тут лишняя проверка. |
Сообщ.
#14
,
|
|
|
Пример для проца AVR из stdint.h
Цитата Limits of integer types capable of holding object pointers #define INTPTR_MAX INT16_MAX #define INTPTR_MIN INT16_MIN #define UINTPTR_MAX UINT16_MAX |
Сообщ.
#15
,
|
|
|
У меня такое чувство, что ты решаешь компилятором задачу для системы сборки.
|