yohhoyの日記

技術的メモをしていきたい日記

環境依存コード切り替えマクロ

C/C++プリプロセッサを利用した環境依存コードの切り替え。通常の#ifdef#endif方式で切り替えるより見た目が綺麗?

unsigned int get_tick_msec()
{
ENV_windows(
  return GetTickCount();
)
ENV_linux(
  struct timespec ts;
  clock_gettime(CLOCK_MONOTONIC, &ts);
  return (tp.tv_sec * 1000) + (unsigned int)(tp.tv_nsec / 1000000);
)
}

上記コードで用いたマクロ定義は下記の通り。(__VA_ARGS__利用のため、C99以降またはC++11以降)

#ifdef _WIN32
#define ENV_windows(...) __VA_ARGS__
#else
#define ENV_windows(...)
#endif

#ifdef __linux__
#define ENV_linux(...) __VA_ARGS__
#else
#define ENV_linux(...)
#endif