はりぼて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();
}
}