メインコンテンツまでスキップ

C++化

C では多少型が違っても void*int になってわりとコンパイルが通る。 関数 signature が無くてもコンパイルが通る。 C++ ではそうはいかない。 そこがいい。

なので C++ 化を最初にやって、それから改造に入る。 先にマクロ確定によってコード量を減らしているので、少し楽ができるはず。

add extern "C"

main.c を main.cpp にするところから。

#includeextern "C" で囲う。

extern "C" {
#define MAINPROGRAM
#include "fm.h"
#include "mailcap.h"
#include "file.h"
#include "local.h"
#include "signal_util.h"
#include <stdio.h>
// …
}

ビルドしてみる。 C と C++ の仕様差でコンパイルが通らないところを修正する。

  • void* の暗黙キャストを明示する(malloc の戻り値に多発する)
  • const char* に対応する(文字列定数の代入で多発)
  • 引数や戻り値が違う関数ポインタが通らなくなるので修正する

だいたいこれだけ。 多いファイルも少ないファイルもある。

main.cpp を最初にやったのだが、main.cpp 一番難しかったかもしれない。 容易にコンパイルが通らなかった。

signal.h

signal handler の関数ポインターの型が混乱の元なので きっちり局所化して隔離した。 今回は、POSIX 一本で決め打ちだし。

void handler(int);

// わかりづらい
void *MySignal(int signal, void(*handler)(int))(int);

// たぶんこう
typedef void(*MyHandlerType)(int);
MyHandlerType MySignal(int signal, MyHandlerType handler);

const char*

これは適当に。諦め(cast)も必要。

remove extern "C"

ひとつずつ追加した extern "C" をまとめて除去する。 コンパイル通るかな? 通ったー。 これで 初手 cpp 完了。 がんがん改造して参りましょう。