C 言語は Linux と Windows の両方で動作するコードを書けますが、OS やコンパイラによって異なる部分を吸収するための工夫が必要です。プリプロセッサマクロ (#ifdef・#if defined) を使った条件コンパイルが主な手段で、OS の判別やコンパイラ固有の属性・宣言の差異を吸収します。
このリポジトリは Linux (GCC) と Windows (MSVC) の両方をサポートするクロスプラットフォーム設計になっています。prod/calc/include/libcalc.h では、Windows の DLL エクスポート宣言(__declspec(dllexport))と Linux の可視性属性(__attribute__((visibility("default"))))を条件コンパイルで切り替えています。同様のパターンは prod/ 配下の他のヘッダーファイルにも見られます。
ビルドシステム (makefile) 側でも OS やコンパイラの違いを吸収しており、makefw/ サブモジュールが Linux / Windows の差異をテンプレートとして提供しています。
__declspec 使用例 (日本語)#ifdef などのプリプロセッサ指令 (日本語)クロスプラットフォーム宣言のパターン (prod/calc/include/libcalc.h の例):
/* DLL エクスポート/インポートのクロスプラットフォーム定義 */
#if defined(_WIN32) || defined(_WIN64)
#ifdef LIBCALC_EXPORTS
#define LIBCALC_API __declspec(dllexport)
#else
#define LIBCALC_API __declspec(dllimport)
#endif
#else
#define LIBCALC_API __attribute__((visibility("default")))
#endif関連ファイル:
prod/calc/include/libcalc.h - 動的ライブラリのエクスポート宣言prod/calc/include/libcalcbase.h - 静的ライブラリのヘッダーprod/calc/include/libcalc_const.h - OS に依存しない定数定義makefile での OS 判別 (makefw/ テンプレートより):
ifeq ($(OS),Windows_NT)
# Windows 向けの設定
SHARED_EXT := dll
LIB_EXT := lib
else
# Linux 向けの設定
SHARED_EXT := so
LIB_EXT := a
endif