kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Cのマクロは奥深い

実用Cプログラミング・テクニック 第1回 ソースを自在に書き換えるマクロとプリプロセサ 【▲→川俣晶の縁側→技術関連執筆情報】より
該当記事をまだ読んでいません(__)。C#を使いはじめたときに不満だったのが、C/C++にあるプリプロセッサで置換されている定数のいくつかが無かったことでした。C/C++プリプロセッサそのものを採用しなかったことは問題ないと思っているのですが、__FILE__と__LINE__は欲しかった(と当時は思っていました)。このことは移行した人がよく詰まるようで、一年に数回質問を見かけます。
ないとわかったとき、それでもあきらめきれなくて、なんとか方法がないものかと調べた結果をウェブリブログの方に書いています。
C#で__LINE__や__FILE__プリプロセッサマクロを使いたい 屋根裏部屋別館blog/ウェブリブログ(続編もあります)
VS2003の話ですが、2005でもやることは同じです。pdbファイルがリリース版にも必要なのが、ちょっとスマートじゃないかなぁと思うのですが、仕方ない。
私がCのマクロでよく使う(使っていた)のはこんな感じ。

#ifdef _DEBUG
#define DEBUGPRINT_LONG(x, y) \
{ \
  TCHAR szOut[512]; \
  wsprintf(szOut, "%s(%d) %s = %ld", __FILE__, __LINE__, x, y); \
  OutputDebugString(szOut); \
}
#else
#define DEBUGPRINT_LONG(x, y) {x;y;}
#endif

デバッグ版を生成するとログを吐いて、リリース版では吐かないといった感じ。6,7年くらい前はこういうソースをあちこちで使っていました。ただ、ここ4,5年は考えをやや改めていて、リリース版だからこそ採取できなくちゃなぁと。なので、影響でない範囲で出した方がいいなぁと思うようになっています(思いつくのおそい?)。
ただ、考えることはみんな同じのようで、OutputDebugString()で出しちゃうと、他のソフトと出力が競合というか、混合しちゃうことがあるんですよね:-(。MetaFrameのICAクライアントとか、バージョンによっては残したままってこともあって、通信のタイミングで出たり、ポーリングしているタイミングで出力してくれるので、困りますです。
マクロを使いまくるのはLinux登場以前のUNIX系のソースが思い出されます。今とは比較にならないくらい様々なCPUで生成できなくてはならないソースだったので、#ifdefとマクロの嵐だったような。