マクロ

Cmのマクロシステムは、コンパイル時にコードを展開する機能を提供します。C言語の#defineに似ていますが、型安全です。

定数マクロ

基本的な使い方

// 定数マクロの定義
macro int VERSION = 13;
macro string APP_NAME = "MyApp";
macro bool DEBUG = true;

int main() {
    println("Version: {VERSION}");    // Version: 13
    println("App: {APP_NAME}");       // App: MyApp
    
    if (DEBUG) {
        println("Debug mode");
    }
    
    return 0;
}

サポートされる型

int macro int SIZE = 100;
string macro string NAME = "Hello";
bool macro bool ENABLED = true;

関数マクロ

引数なし関数マクロ

macro int VERSION = 13;

// 引数なし関数マクロ
macro int*() get_version = () => VERSION;

int main() {
    int v = get_version();  // 展開: VERSION -> 13
    println(v);             // 13
    return 0;
}

引数あり関数マクロ

// 引数あり関数マクロ
macro int*(int, int) add = (int a, int b) => a + b;
macro int*(int, int) mul = (int a, int b) => a * b;

int main() {
    int sum = add(3, 5);       // 展開: 3 + 5 -> 8
    int product = mul(4, 6);   // 展開: 4 * 6 -> 24
    
    println("Sum: {sum}");         // Sum: 8
    println("Product: {product}"); // Product: 24
    
    // マクロの組み合わせ
    int combined = add(mul(2, 3), 4);  // (2*3) + 4 = 10
    println("Combined: {combined}");    // Combined: 10
    
    return 0;
}

関数マクロの構文

macro 戻り値型*(引数型1, 引数型2, ...) マクロ名 = (引数1, 引数2, ...) => 式;

マクロ vs const

特徴 macro const
展開タイミング コンパイル前 コンパイル時
関数形式 ✅ 対応 ❌ 非対応
型チェック ✅ 型付き ✅ 型付き
用途 条件付きコンパイル、DSL 定数値

使用例: デバッグマクロ

macro bool DEBUG = true;

macro void*(string) debug_log = (string msg) => {
    if (DEBUG) {
        println("[DEBUG] {msg}");
    }
};

int main() {
    debug_log("Starting...");  // DEBUGがtrueの場合のみ出力
    
    // メイン処理
    int result = 42;
    
    debug_log("Result: {result}");
    
    return 0;
}

注意事項

関連項目

最終更新: 2026-02-08