Компиляция C++ в Windows и Linux: переключатель ifdef [дубликат]
этот вопрос уже есть ответ здесь:
- Как проверить ОС с помощью директивы препроцессора? 13 ответов
Я хочу запустить некоторый код c++ на Linux и Windows. Есть некоторые куски кода, которые я хочу включить только для одной операционной системы, а не другой. Есть ли стандарт #ifdef что когда-то можно использовать?
что-то типа:
#ifdef LINUX_KEY_WORD
... // linux code goes here.
#elif WINDOWS_KEY_WORD
... // windows code goes here.
#else
#error "OS not supported!"
#endif
вопрос действительно дубликат, но ответы здесь намного лучше, особенно принятый.
7 ответов:
использование:
#ifdef __linux__ //linux code goes here #elif _WIN32 // windows code goes here #else #endif
Я знаю, что это не ответ, но если кто-то ищет же в Qt
В Qt
https://wiki.qt.io/Get-OS-name-in-Qt
QString Get::osName() { #if defined(Q_OS_ANDROID) return QLatin1String("android"); #elif defined(Q_OS_BLACKBERRY) return QLatin1String("blackberry"); #elif defined(Q_OS_IOS) return QLatin1String("ios"); #elif defined(Q_OS_MAC) return QLatin1String("osx"); #elif defined(Q_OS_WINCE) return QLatin1String("wince"); #elif defined(Q_OS_WIN) return QLatin1String("windows"); #elif defined(Q_OS_LINUX) return QLatin1String("linux"); #elif defined(Q_OS_UNIX) return QLatin1String("unix"); #else return QLatin1String("unknown"); #endif }
можно сделать
#if MACRO0 //code... #elif MACRO1 //code... #endif
где макрос может быть:
__linux__ Defined on Linux __sun Defined on Solaris __FreeBSD__ Defined on FreeBSD __NetBSD__ Defined on NetBSD __OpenBSD__ Defined on OpenBSD __APPLE__ Defined on Mac OS X __hpux Defined on HP-UX __osf__ Defined on Tru64 UNIX (formerly DEC OSF1) __sgi Defined on Irix _AIX Defined on AIX
этот ответ не касается войны макросов, но создает ошибку, если соответствующая платформа не найдена.
#ifdef LINUX_KEY_WORD ... // linux code goes here. #elif WINDOWS_KEY_WORD ... // windows code goes here. #else #error Platform not supported #endif
Если
#error
Не поддерживается, вы можете использовать ключевое слово static_assert (C++0x). Или вы можете реализовать пользовательский STATIC_ASSERT, или просто объявить массив размером 0, или иметь переключатель, который имеет повторяющиеся случаи. Короче говоря, произведите ошибку при время компиляции, а не runtime
это зависит от используемого компилятора.
например, определение Windows может быть
WIN32
или_WIN32
.и определение Linux может быть
UNIX
или__unix__
илиLINUX
или__linux__
.
Это зависит от компилятора. Если вы компилируете, скажем, G++ в Linux и VC++ в Windows, это будет делать:
#ifdef linux ... #elif _WIN32 ... #else ... #endif
нет, эти определения зависят от компилятора. Что вы можете сделать, используйте свой собственный набор определений и установите их в файле Makefile. Смотрите этой теме для получения дополнительной информации.