C では多少型が違っても void* や int になってわりとコンパイルが通る。 関数 signature が無くてもコンパイルが通る。 C++ ではそうはいかない。 そこがいい。
unknown: html => {"type":"html","value":"<!-- truncate -->","position":{"start":{"line":7,"column":1,"offset":98},"end":{"line":7,"column":18,"offset":115}}}
なので 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 完了。 がんがん改造して参りましょう。
2024
0130