Cプリプロセッサ・パワー

このタイトルにピントきたら110番

「Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング

Cプリプロセッサでプログラムを書く方法(1)

http://d.hatena.ne.jp/qnighy/20091107/1257587259

興味深いが,一言で言えば「よい子は まともなプログラマーは真似しちゃいけないよ」.ほとんど「Cプログラミング診断室」や「Javaパズラー」の世界だ.*1

改訂新版 Cプログラミング診断室

改訂新版 Cプログラミング診断室

「マクロの乱用」はC言語の有名なバッドプラクティスの一つなのだ.これでもし,「Cのマクロを組んで作業するのは実力ではないですか?」*2なんて言ってくる奴がいたら,とりあえず性根をたたき直しておいた方が良い.

関数マクロを使う理由は性能にある.マクロには関数呼び出しのオーバーヘッドが存在しないからだ.もっともこの理由は,Cが初めて定義された頃,つまりマシンが低速で関数呼び出しが高価だった時代でさえ説得力に欠けていたくらいだから,今日では全く的外れだ.最近のマシンとコンパイラを使う限り,関数マクロの短所は長所を上回っている.

関数マクロはなるべく使うな(中略)Cではマクロによって解決される問題よりも引き起こされる問題の方が多い.

関数マクロにまつわる最悪の問題の一つは,パラメータが定義中に複数回登場すると,それが複数回評価される場合がある点だ.呼び出す際の引数に副作用を伴う式が含まれていると厄介なバグを引き起こす

プログラミング作法

プログラミング作法

*3


ところで,このネタについては伝説のこの本についても触れておくべきだろう.*4私も実物は見たことがないが,どうやらあの憂鬱本をも凌ぐ凄まじい迷著のようだ.幸いなことに有名にはならなかったようだが実物を見かけたら話のネタで購入してもいいかもしれない.

内容については、はっきりいって、滅茶苦茶である。さっさと火をつけて燃やしてしまうなり、いますぐ廃棄処分すべきである。

なぜ、こんなことを書くかというと、マクロの悪用の例ばかりが載っていて、これを鵜のみにして、マクロが理解できたと思ってプログラムを書いたりしたら、100%保証つきでプログラムがボロボロになるからである。この本に載っているようなマクロの使い方をするプログラマが社内にいたら、即刻『首』にするのが妥当であろう。そして、プログラムもさっさと廃棄処分にした方が良かろう。

著者はC言語を知っているのであろうか。まあ、文法の重箱の隅をつつくようなことはやったことがあるみたいだが、Cのプログラム開発とは無縁の世界の人だろう。

http://www.pro.or.jp/~fuji/computerbooks/c/cprepro.hayashi.html

「可読性が良くなる」というのはソースコード自体の行数が少なくなっただけで、my.hの中身を参照しないと何の動作か分からない。章が進むにつれて、プリプロセッサを使うためにプリプロセッサを書いている様な感じになってきて、どんどん複雑怪奇になり、プリプロセッサを使わないソースコードの方がよっぽど見易いと思う様なものになっている。

http://d.hatena.ne.jp/LaclefYoshi/20060303/1141388194

しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。
文法も、どこぞのPerlC++と比べたら屁でもない単純さです。

この部分には同意.ただしポインタを自在に使いこなす素質みたいなのはあるらしく,その素質がない「似非プログラマ」は,この世界に入らないのが吉.*5

*1:「泥沼関数型」と書いてるくらいだから,自分でも分かってるんだろうけどさ.

*2:http://d.hatena.ne.jp/JavaBlack/20091107/p1 とは少し事情が異なる.

*3:ちなみに,あのK&RのKの人ね.

*4:元記事の人は「今時珍しくも無い高校1年生のプログラマー」だそうだから,こんな過去の遺物は知らなくて当然だと思う.いや知らない方が良い.

*5:http://local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA