実をいうと、筆者がこのエラーメッセージの発信元(cg86.exe)を正確に把握したのは、何を隠そう、この文書を書き始めてからのことでした。
以前には、さしたる根拠もないまま、lld.exeのエラーだと信じていたわけですが、あらためて事実を整理してみると、今まで気づかなかったのが不思議なくらい、lldのエラーでないことは明白でした(メッセージの一文字目が異なっていたり、リンカのエラーにしてはオブジェクトの生成が完了していなかったり)。
また、このエラーの正体を確かめるには、lcc.exeの内部コマンドの処理の経過を監視する必要があり、それがわからなかったからこそ、当初のような誤認が生じたともいえるのですが、こちらのほうも筆者が気づかなかった(忘れていた)だけで、答えは最初からマニュアルに明記されていました(lcc.exeの「-v」オプション)。
要するに、筆者の苦労の半分以上は自業自得のミスだったわけで、何ともお恥ずかしい話です。
関数の大きさの目安については、画面をスクロールさせずに見渡せる範囲という表現をする人もいれば、100行以内という人、50行でも多すぎるという人など、様々な立場があるようです。
この辺は、コンパイラの制限というより、個人の信条とか好みの問題なんだろうと思います。
とりあえず、個人が趣味でプログラミングしている分には、エラーにならなければ、それでいいような気もします(モジュール化が不要といってるわけじゃないです)。
筆者の場合、生半可にBASIC系の言語を経験してきたせいか、いまだにBASIC的な考え方にとらわれてしまう傾向があります。
この事例でいえば、C言語の関数をBASIC系のサブルーチンと混同していたり、「何度も使う手順はサブルーチンにする」という鉄則の裏返しで「1回しか使わない手順をサブルーチン(関数)にする必要はない」と思い込んでいたりする点がそうです。
何というか、悪い意味での「三つ子の魂」かもしれません。