Помогите с кроссплатформенным скриптом - определено #IF () - PullRequest
1 голос
/ 22 июня 2011

Я новичок в C ++ Я пишу кроссплатформенный скрипт, вот часть, в которой мне нужна помощь:

#if defined(_WIN64) || defined(_WIN32) ||  defined(__WIN32__) || defined(__TOS_WIN__) ||    defined(__CYGWIN__) || defined(__CYGWIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || defined(__WINDOWS__)
#define M_OS_WIN
#elif defined(__linux) || defined(__linux__) || defined(linux) || defined(__gnu_linux__) ||    defined(__GNUC__)
#define M_OS_LINUX
#else
#error "OS NOT SUPPORTED";
#endif

Какие из них являются правильными значениями (которые устарели, я должен добавить другие)?

  1. Мне нужно, чтобы часть windows была совместима с <conio.h>.
  2. Мне нужна часть Linux для совместимости с g ++ (<unistd.h> и <termios.h> должны работать).
  3. Совместима ли MACOS g ++? (Правильна ли строка ниже?);

    #elif defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

  4. Это правильный способ проверить, является ли компилятор MS Visual Studio - #if defined _MSC_VER?

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Коллекция всех текущих (и устаревших) макросов, определенных для прекомпилятора на каждой платформе / системе / архитектуре, доступна на SourceForge.Посмотрите проект Предопределенные макросы компилятора .

В моих кроссплатформенных проектах я обычно придумываю свое имя для каждого варианта использования и определяю его следующим образом:1005 *

#define OS_WINDOWS (defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) ...)

Так что остальная часть моего кода зависит только от простого

#include "configure.h" // defines OS_WINDOWS, etc.
#ifdef OS_WINDOWS
   // Windows-specific stuff here.
#endif
0 голосов
/ 22 июня 2011

Обычно каждый компилятор предоставляет предопределенные макросы для определения платформы.Вы должны искать predefined macro для конкретного компилятора.

Например: для MSVC предопределенные макросы находятся здесь здесь

Совместимо ли MACOS g ++?
ДаКомпилятор, который поставляется с пакетом инструментов Apple XCode, в основном g ++, но они немного его взломали.

(Правильно ли указана строка ниже?

#elif defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

Вам также нужно добавить

#elif defined(macintosh) || defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

Отметьте это специально здесь .

Этоправильный способ проверить, является ли компилятор MS Visual Studio - #if defined _MSC_VER?

Да, согласно исключению из предопределенных макросов для ссылки MSVC, которую я дал выше.

Он оценивает компоненты старшего и младшего номеров в номере версии компилятора. Старший номер является первым компонентом номера версии, разделенного точками, а младший номер - вторым компонентом. Например, если номер версииVisual C++ compiler равен 15.00.20706.01, макрос _MSC_VER оценивается как 1500. В Visual Studio 2010, _MSC_VER определяетсянед. как 1600.

...