Компиляция C++ в Windows и Linux: переключатель ifdef
Я хочу запустить код на 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
Ты можешь сделать
#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
Я знаю, что это не ответ, но добавил, если кто-то ищет то же самое в 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
}
Это зависит от используемого компилятора.
Например, определение Windows может быть WIN32
или же _WIN32
,
И определение Linux может быть UNIX
или же __unix__
или же LINUX
или же __linux__
,
Этот ответ не о макро войне, но выдает ошибку, если не найдено подходящей платформы.
#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, или иметь переключатель, который имеет повторяющиеся регистры. Короче говоря, выдает ошибку во время компиляции, а не во время выполнения
Это зависит от компилятора. Если вы скомпилируете, скажем, с G++ на Linux и VC++ на Windows, это будет делать:
#ifdef linux
...
#elif _WIN32
...
#else
...
#endif
Нет, эти определения зависят от компилятора. Что вы можете сделать, использовать свой собственный набор определений и установить их в Makefile. Смотрите эту тему для получения дополнительной информации.