На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Определение целевой OS и разряднности препроцессором
    Всем привет!

    Понадобилось для себя написать ряд условий препроцессора для определения, скажем так, "целей" для различных тулчейнов на базе CGG/Clang.
    Вот тут я определяю OS из списка: Windows, Linux, Mac OS X, FreeBSD, Android, Solaris, SunOS, QNX.
    Остальные операционные системы пока не интересуют.

    ExpandedWrap disabled
      #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:
    ExpandedWrap disabled
      #if INTPTR_MAX == INT64_MAX
      #define BIT_NAME "x64"
      #else
      #define BIT_NAME "x32"
      #endif

    На сколько оно корректно? На сколько оно корректно для прочих архитектур, кроме i686 и x86_64.
      JoeUser
      А зачем вы всё с ног на голову поставили?
        Цитата Pavia @
        А зачем вы всё с ног на голову поставили?

        В смылсе?
          Цитата Pavia @
          А зачем вы всё с ног на голову поставили?

          Так и не дождался объяснения вопроса! :-?

          Скрытый текст
          user posted image
            1. В первой строке, наверное, опечатка, и должно быть в одном из вариантов _WIN64.
            2. __OS2__ для OS/2 :-)

            Добавлено
            С разрядностью:
            1. Похрамывает для случая 16-битных систем.
            2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю). :-?
              Цитата Славян @
              1. В первой строке, наверное, опечатка, и должно быть в одном из вариантов _WIN64.

              Точно!
              Цитата Славян @
              2. __OS2__ для OS/2 :-)

              Эх ... такая система когда то была!!! :'( Я с 3.62 версии ее юзать начинал. Лет 5 на ней сидел.
              Цитата Славян @
              1. Похрамывает для случая 16-битных систем.

              Не, не нужны они мне.
              Цитата Славян @
              Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю).

              Хм ... надо выяснить.

              Пасип, Славян! :victory:
                Лучше начать отсюда: https://sourceforge.net/p/predef/wiki/Home/
                  Flex Ferrum, по поводу OS - сверил, у меня все верно.

                  А вот по поводу:

                  Цитата Славян @
                  2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю).

                  Славян меня немного в тупик поставил.
                    Цитата JoeUser @
                    А вот по поводу:

                    Лучше смотреть на макросы из того же справочника. Размер int'а может не быть равным 64 да x64-платформах. Зависит от компилятора и флагов.
                      Цитата Славян @
                      2. Itanium тоже (думается) должен совпасть с INTPTR_MAX == INT64_MAX, но он всё же не x64 (насколько я понимаю).

                      Если вики не врет:

                      user posted image
                        Цитата Flex Ferrum @
                        Лучше смотреть на макросы из того же справочника.

                        Что-то там про разрядность не нахожу :(

                        Цитата Flex Ferrum @
                        Размер int'а может не быть равным 64 да x64-платформах. Зависит от компилятора и флагов.

                        А если вот так:

                        ExpandedWrap disabled
                          #if (INTPTR_MAX == INT64_MAX) || defined(__LP64__) || defined(_LP64)
                          #define BIT_NAME "x64"
                          #else
                          #define BIT_NAME "x32"
                          #endif

                        ???
                          Цитата JoeUser @


                          Здесь: https://sourceforge.net/p/predef/wiki/Architectures/
                            Цитата Flex Ferrum @

                            Не не не - это тупик! Выводить битность из модели CPU - хреновое решение, имхо!
                            Представь, что выйдет какой-нить очередной камень, для его идентификации
                            потребуется свой макро, которого нет в том чудо списке - труба.

                            Но всеж, думаю, последнее мое решение правильное - из заголовком используемого тулчейна!

                            Добавлено
                            Цитата Flex Ferrum @
                            Размер int'а может не быть равным 64 да x64-платформах.

                            Стоп стоп стоп!!! Условие "INTPTR_MAX == INT64_MAX" говорит совсем о другом. А именно, что максимальный размер целого, могущего хранить указатель - равен предопределенной константе размера целого в 64 бита. Таким образом, может и __LP64__ тут лишняя проверка.
                              Пример для проца 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
                                У меня такое чувство, что ты решаешь компилятором задачу для системы сборки.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0819 ]   [ 17 queries used ]   [ Generated: 18.04.24, 02:01 GMT ]