はい、最も単純なケースでは、たとえば foo() という関数を想定すると、そのようなことができます...
/* Are we on a Windows platform ? */
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) || defined(__TOS_WIN__)
void foo( ... ) {
/* windows implementation */
}
/* Are we on a Linux platform ? */
#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
void foo( ... ) {
/* linux implementation */
}
/* Are we on a Unix platform ? */
#elif defined(__unix__) || defined(__unix) || defined(unix) \
|| defined(__CYGWIN__) || ( defined(__APPLE__) && defined(__MACH) )
void foo( ... ) {
/* unix implementation */
}
/* Are we on Unsupported platform? */
#else
void foo( ... ) {
/* generic implementation */
}
#endif
もう 1 つのオプションは、さまざまなバージョンの関数を実装する各 OS にさまざまなヘッダー ファイルを用意し、条件付き#include
で適切なものを用意することです。
myproj_win32.h、myproj_linux.h、myproj_unix.h、myproj_generic.h と呼ばれるいくつかのヘッダー ファイルを想定すると、次のようなことができます...
/* Are we on a Windows platform ? */
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) || defined(__TOS_WIN__)
#include "myproj_win32.h"
/* Are we on a Linux platform ? */
#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
#include "myproj_linux.h"
/* Are we on a Unix platform ? */
#elif defined(__unix__) || defined(__unix) || defined(unix) \
|| defined(__CYGWIN__) || ( defined(__APPLE__) && defined(__MACH) )
#include "myproj_unix.h"
}
/* Are we on Unsupported platform? */
#else
#include "myproj_generic.h"
#endif
正しいバージョンの実装のみがコンパイルされます。より多くのオプションがありますが、それらはあなたが始めるのに十分なはずです.
編集
これは、一般的な C/C++ コンパイラ用の定義済みマクロへの便利なリンクです。