はりぼてOSでC++言語を使いたい
- 出版社/メーカー: 毎日コミュニケーションズ
- 価格: ¥ 3,990
- メディア: 和書
はりぼてOS は、アセンブラに比べれば見通しのよいC言語で書かれています。しかし、普段からオブジェクト指向バリバリの人にはC言語ですら可読性が低く、C++言語で書けたらどんなにいいだろうと思っていました。試行錯誤の結果、うまくいったので、その紹介です。
必要なファイル
http://sourceforge.net/project/showfiles.php?group_id=2435 から「MinGW 5.0.2」をダウンロードします。
インストール
Makefileの設定
以下の設定を追加します。例は harib00j の例です。長ったらしいオプションは、Mona から伝授された OS を作るときのおまじないです。
CPP = $(TOOLPATH)c++.exe -I$(INCPATH) -Os -Wall -nostdlib -fno-builtin -fno-exceptions -fno-rtti -B$(TOOLPATH) -c #bootpack.gas : bootpack.c Makefile # $(CC1) -o bootpack.gas bootpack.c #bootpack.nas : bootpack.gas Makefile # $(GAS2NASK) bootpack.gas bootpack.nas #bootpack.obj : bootpack.nas Makefile # $(NASK) bootpack.nas bootpack.obj bootpack.lst bootpack.obj : bootpack.cpp Makefile $(CPP) -o bootpack.obj bootpack.cpp
bootpack.cpp
ポイントは以下のとおりです。
/* C言語の関数宣言 */ extern "C" { void io_hlt(void); void HariMain(void); }; /* C++言語の関数宣言 */ void CppMain(void); /* C言語の入り口 */ void HariMain(void) { CppMain(); } /* とりあえずごまかす */ void* operator new(unsigned int size) { return (void *)0; } void operator delete(void* address) {} void* operator new[](unsigned int size) { return (void *)0; } void operator delete[](void* address) {} /* テストクラス */ class Test { public: /* コンストラクタ */ Test() { for (int i = 0xa0000; i <= 0xaffff; i++) { char *p = (char *)i; /* 番地を代入 */ *p = i & 0x0f; } } virtual ~Test() { } }; /* C++言語の入り口 */ void CppMain(void) { Test test; for (;;) { io_hlt(); } }