最近俺的にプギャーな出来事が多い。C言語に関して。
- static *char func() {} ってナニ!?
- 「変数はブロックの初めに宣言しなければならない」というANSI(C89) なルールを巡って「gccなんてゆとりコンパイラ使ってるからだ」といわれのないDISをくらう
- 以前 /.J で書いた このコードがセグる 理由を思い出すのに3分かかった
----
Cが体に染み付いている人には釈迦に説法でしかないが、自分へのメモとして上記を解説しておく。
※ 1. は当然 *char なんて型はないのでエラーになる(char* はあるけどね!)。関数の引数や変数宣言については絶対に間違わないのだが、関数の戻り値については上記のような間違いを未だによくする(´ー`; )
※ 2. は gcc4 が C99 なモードでデフォルトは動くから、 int a; a = 1; int b = 100; などというコードをブロックのはじめに書いていても通るのであって、gccが悪いわけではない。こうしたC++的なコードについて、ANSI C 的な警告を出させたければ、-Wall では駄目で、-pedantic オプションをつけてコンパイルする必要がある。
※ 3. は *p == "\n" が、ポインタと文字列の先頭アドレスを比較しているだけであって、実際に文字列比較を行っていないために、無限ループがbreakせず、(たまたま連続して格納されていると思われる) char *envp[] および、それ以降の領域を読んでしまってセグるというもの