2008/08/20

m9(*´〜`) (C language memo)

http://d.hatena.ne.jp/keyword/m9%A1%CA%A1%B0%A7%A5%A1%B0%A1%CB%A5%D7%A5%AE%A5%E3%A1%BC%A1%BC%A1%BC%A5%C3

最近俺的にプギャーな出来事が多い。C言語に関して。
  1. static *char func() {} ってナニ!?
  2. 「変数はブロックの初めに宣言しなければならない」というANSI(C89) なルールを巡って「gccなんてゆとりコンパイラ使ってるからだ」といわれのないDISをくらう
  3. 以前 /.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[] および、それ以降の領域を読んでしまってセグるというもの

0 件のコメント: