X68000 向けのモダン C++ (C++20) サンプルプロジェクトです。 xdev68k ツールチェーン (GCC 10.2.0) を使用して、レトロプラットフォーム上でモダンな C++ 機能を活用する方法を示します。
- constexpr if
- Structured bindings (構造化束縛)
- if/switch with initializer
- constexpr lambda
- Fold expressions
- Inline variables
- Class template argument deduction (CTAD)
- Nested namespaces
- auto template parameters
[[maybe_unused]],[[nodiscard]]attributes
- consteval (即時関数)
- constinit (静的初期化保証)
- Concepts (テンプレート制約)
std::vectorstd::mapstd::optionalstd::variantstd::string_viewstd::array<algorithm>,<numeric><type_traits>
- xdev68k ツールチェーン
- MSYS2 (ビルド環境)
- X68000 実機 または エミュレータ (XM6, XEiJ 等)
x68k-modern-cpp-sample/
├── Makefile # ビルド設定
├── README.md # このファイル
├── docs/
│ └── cpp17-features.md # C++17 機能の解説
└── src/
├── main.cpp # メインソースコード (C++17 デモ)
├── test_constexpr.cpp # std::array + constexpr lambda
├── test_vector.cpp # type_traits デモ
├── test_stl.cpp # STL コンテナデモ (vector, map, optional, variant)
└── test_cpp20.cpp # C++20 デモ (consteval, constinit, concepts)
MSYS2 環境で以下のコマンドを実行します:
# 環境変数の設定 (xdev68k のインストールパスに合わせて変更)
export XDEV68K_DIR=/d/dev/xdev68k
# プロジェクトディレクトリに移動
cd /path/to/x68k-modern-cpp-sample
# ビルド実行
make
# クリーン (中間ファイルと実行ファイルを削除)
make cleanビルドが成功すると MAIN.X が生成されます。
生成された MAIN.X を X68000 実機またはエミュレータにコピーして実行します。
A>MAIN.X
| オプション | 説明 |
|---|---|
-std=gnu++20 |
C++20 標準 + GNU 拡張 |
-m68000 |
68000 CPU 向けコード生成 |
-Os |
サイズ最適化 |
-fno-rtti |
RTTI 無効 (型情報なし) |
-fno-exceptions |
例外処理無効 |
-finput-charset=utf-8 |
ソースファイルは UTF-8 |
-fexec-charset=cp932 |
実行時文字コードは CP932 (Shift-JIS) |
XC ライブラリのヘッダ (stdio.h 等) と GCC の標準ライブラリヘッダは競合するため、
STL コンテナを使用するファイルは XC ヘッダなしでコンパイルする必要があります。
本プロジェクトでは test_stl.cpp を専用のコンパイルルールで処理しています:
# XC ヘッダなしでコンパイル
CXXFLAGS_NO_XC = ... -std=gnu++20printf 等の関数は手動で宣言します:
extern "C" {
int printf(const char* format, ...);
}xdev68k 環境での C++ 利用には以下の制限があります:
- 例外処理が使えない -
-fno-exceptionsが必須 - RTTI が使えない -
-fno-rttiが必須、dynamic_castやtypeidは使用不可 <iostream>は使えない -printf等の XC ライブラリ関数を使用- XC ヘッダと STL の併用は不可 - ヘッダの競合があるため別々にコンパイル
- 68060 は非サポート - g2as.x / g2lk.x が 68040 までしか対応していない
- C++17 機能の解説 - 本サンプルで使用している C++17 機能の詳細解説
MIT License