【C/C++】#ifdefによるOS判別マクロで、OSに依存しないコードを書く方法
OSに依存しないコードとは
ここで紹介するのは、実行環境のOSがWindowsであってもLinuxやmacOSであっても動作し、それぞれのOSに応じた処理を自動的に切り替えられるC/C++プログラムの書き方です。例えば、「Windowsならdirコマンド、それ以外ならlsコマンドでファイル一覧を取得したい」といったケースで役立ちます。
OSを判別する定義済みマクロ
多くのC/C++コンパイラには、コンパイル時に実行対象のOSを検出するための定義済みマクロが用意されています。GCCコンパイラで利用できる主なマクロは以下の通りです。
- _WIN32: 32ビット・64ビット両方のWindows OSで定義されるマクロ
- _WIN64: 64ビット版Windows OSでのみ定義されるマクロ
- __unix__ / __linux__: UNIX系OSやLinuxで定義されるマクロ
- __APPLE__: macOSで定義されるマクロ
これらのマクロを#ifdefなどの前処理命令と組み合わせることで、条件付きコンパイルによりOSごとに異なるコードを切り替えることができます。
サンプルプログラム
次の例では、Windows環境では「dir」コマンド、それ以外の環境では「ls」コマンドを実行し、カレントディレクトリ内のファイル一覧を表示します。
#include <iostream>
using namespace std;
int main() {
#ifdef _WIN32
system("dir");
#else
system("ls");
#endif
return 0;
}
実行結果
このプログラムは、実行されたOSに関係なく、カレントディレクトリ内のすべてのファイルを出力画面へ一覧表示します。Windows上でコンパイル・実行すれば「dir」が、LinuxやmacOS上では「ls」が自動的に選択される仕組みです。
押さえておきたいポイント
- 条件付きコンパイルを活用すれば、1つのソースコードを複数のプラットフォーム向けに再利用でき、保守性が大きく向上します。
- より本格的な移植性が必要な場合は、C++17の<filesystem>ライブラリやBoost.Filesystemの利用も検討するとよいでしょう。
-
C/C++のmemcpy()関数の使い方と実例解説
この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ