コードにならない無限ループ

海岸通をチャリで飛ばしながらこう考えた
文字を受け取って自分自身と同じ仕様の関数ポインタ(これを仮に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)にキャストすればいい… のかな?