как надежно определить mac os x, ios, linux, windows in c препроцессор?

<p>если есть некоторый кроссплатформенный код c/c++, который должен быть скомпилирован в mac os x, ios, linux, windows, как я могу надежно обнаружить их во время процесса препроцессора?</p>

<p>есть предопределенные макросы, которые используются большинством компиляторов, вы можете найти список <a href="http://sourceforge.net/p/predef/wiki/operatingsystems">здесь</a> . предопределенные макросы компилятора gcc можно найти <a href="http://gcc.gnu.org/onlinedocs/cpp/predefined-macros.html">здесь</a> . вот пример для gcc:</p><pre><code>#ifdef \_win32 //define something for windows (32-bit and 64-bit, this part is common) #ifdef \_win64 //define something for windows (64-bit only) #else //define something for windows (32-bit only) #endif #elif \_\_apple\_\_ #include "targetconditionals.h" #if target\_iphone\_simulator // ios simulator #elif target\_os\_iphone // ios device #elif target\_os\_mac // other kinds of mac os #else # error "unknown apple platform" #endif #elif \_\_linux\_\_ // linux #elif \_\_unix\_\_ // all unices not caught above // unix #elif defined(\_posix\_version) // posix #else # error "unknown compiler" #endif </code></pre><p>определенные макросы зависят от компилятора, который вы собираетесь использовать.</p><p><code>\_win64</code> <code>#ifdef</code> может быть вложен в <code>\_win32</code> <code>#ifdef</code>, потому что <code>\_win32</code> определяется при таргетинге на windows, а не только на версию x86. это предотвращает дублирование кода, если некоторые из них являются общими для обоих.</p>

<p>как указывает джейк, target\_iphone\_simulator является подмножеством target\_os\_iphone.</p><p>кроме того, target\_os\_iphone является подмножеством target\_os\_mac.</p><p>таким образом, лучший подход может быть:</p><pre><code>#ifdef \_win64 //define something for windows (64-bit) #elif \_win32 //define something for windows (32-bit) #elif \_\_apple\_\_ #include "targetconditionals.h" #if target\_os\_iphone && target\_iphone\_simulator // define something for simulator #elif target\_os\_iphone // define something for iphone #else #define target\_os\_osx 1 // define something for osx #endif #elif \_\_linux // linux #elif \_\_unix // all unices not caught above // unix #elif \_\_posix // posix #endif </code></pre>

<p>отчасти ответ: люди на <a href="http://nadeausoftware.com/articles/2012/01/c\_c\_tip\_how\_use\_compiler\_predefined\_macros\_detect\_operating\_system">[этот сайт]</a> нашли время, чтобы составить таблицы <em> макросов, определенных для каждой пары ос/компилятора </em>.</p><p>например, вы можете видеть, что <code>\_win32</code> не определен в windows с cygwin (posix), тогда как is определен для компиляции в windows, cygwin (не-posix) и mingw с каждым доступным компилятором (clang, gnu, intel и т.д.).</p><p>во всяком случае, я нашел таблицы довольно информативными и решил поделиться здесь.</p>