Vol.49』に紹介されていてびっくり。「濃縮還元オレンジニュース」で紹介していただいたのは知っていたんですけど,まさか本誌に載るとは......。記念に一冊買ってしまいました。話でちと盛り上がっていました。Yourself)の特集で,要するに,繰り返しや重複するコードをなくしましょうという話。取り扱わないんですけれど,今回はマクロスイッチを使って宣言の数を減らす参考例が挙げられていました(p46)。マクロ定義する」と読みます。空を定義する」ことになります。定義されているソースだけ変数定義にすることができて,その他のソースでは変数宣言にすることができるんだとか。するだけでいいので,変数の宣言と定義を意識しないで,大域変数を使うことができるというわけです。今日話していた同僚曰く,「メリットが分からん」とのこと。うちのお作法とはかなり違うやり方なので,まぁ,そうなのかもなぁ,とも。こゆのはお作法の問題なので,どっちがいいとかいった話でもないんでしょうけれど,あたしも同僚と同じく,定義と宣言の区別をあいまいにするような方法には,あまり同意できなかったりします。「定義」と「宣言」つのは,こういう意味を持っています。その識別子で領域を確保して指定した値を代入するのに使う(メモリが確保される)つまるところ,宣言は「このソースでメモリを確保する必要はないけれど,コンパイルするのに名前(とか型名とか)が必要なんです」という意味で,定義は「このソースでメモリを確保しておかないと,コンパイルできませんよ」という意味。プロトタイプ宣言なんかで,引数の型を書くだけだったら,名前を解決できればいいから宣言するだけで十分だけど,具体的に使用されるメモリの大きさが分からないといけない場面では,定義されていないとコンパイルできないわけです。ものすごく初歩的な話なんですけど,そゆこと。こゆ区別がなんで必要なのかというと,デバッグするときに,どのソース(オブジェクトファイル)でメモリを確保しているのか,調べなくちゃいけないときがあるからです。マクロ定義でラップしていると,どこで定義しているのか分からなくて,結局マクロの中身を解読しなくちゃいけなくなります。代わるマクロ定義を用意しなくちゃいけなくなります。いった謎なマクロ定義が増えることになってしまいます。ファイル名とか関数名が変わった時のメンテナンスもしんどそうです(そんなでもないか)。うちのお作法はというと,そんなに大したことはしてなくて,共通ファイルと共通ソースを用意しています。"foo";とかするだけ。コンパイルすれば,定義を作ることができます。各ソースとこの定義はリンク時に解決されることになります。実際,これで足りることが多い。ようなファイルに便乗しちゃってもいいのかも。つけるときは,こんな風にする(まとめて書いちゃいます)。使っていると,ここら辺の区別をちゃんとつけていないと,コンパイル時間が無駄に長くなったり,コンパイルできてもリンクできないとかいったことが続出したりします。1回コンパイルするだけで済みます(リンクし直すだけ)。名前だけ解決できりゃいいのに,ものすごく依存関係のあるソースをコンパイルしちゃったりしてたら,時間の無駄ですもんね。実現できる場合があるよ,ってな話だったわけで,頭ごなしに批判するもんでもないんだと思います。