コードにならない無限ループ
海岸通をチャリで飛ばしながらこう考えた
文字を受け取って自分自身と同じ仕様の関数ポインタ(これを仮にFltFuncとする)を返す関数を作れば
char c; FltFunc ff = defaultFltFunc; while( (c=getc(fp)) != EOF){ ff = ff(c); }
とかやって
FltFunc defaultFltFunc(char c){ if(c == '/'){ return slashFltFunc; } return defaultFltFunc; } FltFunc defaultFltFunc(char c){ if(c == '/'){ return oneLineComment; }else if(c == '*'){ return multiLineComment; } return defaultFltFunc; }
みたいな実装ができるんじゃね!? と考えた。
さて、実際にコード化してみようかと思った瞬間
FltFunc defaultFltFunc(char c)
は自分と同じ、即ち自分と同じ関数を返すcharを受け取る関数だから
FltFunc (*fp)(char c) defaultFltFunc(char c)
となってこのFltFuncは自分と同じのだから
(FltFunc (*fp)(char c)) (*fp2)(char c) defaultFltFunc(char c)
で、このFltFuncは… となってギクッ コードにならない無限ループだった。
まぁ実際はvoid*を返すようにしといてvoid *(*fp)(char c)にキャストすればいい… のかな?