C では多少型が違っても void*
や int
になってわりとコ ンパイルが通る。
関数 signature が無くてもコンパイルが通る。
C++ ではそうはいかない。
そこがいい。
なので C++ 化を最初にやって、それから改造に入る。 先にマクロ確定によってコード量を減らしているので、少し楽ができるはず。
add extern "C"
main.c を main.cpp にするところから。
#include
を extern "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
完了。
がんがん改造して参りましょう。