|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第480回 マクロ応用など 発行 2004年7月28日(水曜日) 発行数 約2700 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 ・セキュリティ突破のため、暗号化された単語があります。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 またしても、相互紹介の依頼が来ました。 ★日本初の本格的求職広告(匿名・無料)でお仕事探しを応援しています!! ご希望条件に合った求人企業から直接メールを受けることができます。HPと メルマガのW広告で効果大!転職、就職に加え契約、派遣、SOHO等にも対応。 画期的サービスとして新聞・雑誌で多数紹介、お喜びの声続々。求人広告多数 無料メルマガご購読は今スグどうぞ→■ http://www.aweb.jp/jobpn.htm ■ 前回、「豊田自動車とは何か」という余談に走ったきっかけと なった広告です。 今回は、余談はなしです。 ところでプログラマのアルバイトというのは、アルバイトの中で (お水を除き)ナンバーワンなのだそうです。 土日にやりたいところですが、しかしそういうお話は、ど田舎の 豊田市にはないお話、残念。。。 っていうか東京者(とーきょーもん)は、ずるいよね! {magclick} /*========================================================*/ 今回のお題 << マクロ応用など >> /*========================================================*/ 木構造をネストすると、デストラクタとしての処理が必要に なります。 しかし、関数ポインタを使った呼び出しなどは、成功しません。 そこで、マクロの特殊な機能の登場です。 マクロの引き数には、C のコードが直接かけます。 そこに、デストラクタとしての処理を書いてしまえばよいの です。たとえば、 struct shop_t { struct item_t { DEF_TREE_ITEM( item_t ); } *item; DEF_TREE_FUNC( item_t, item ); } *shop = NULL; DEF_TREE_FUNC( shop_t, shop ); (引き数のnameとvarが重複していたので1つにまとめました。) このデータ構造の場合、shop を開放するときに、各構造ごとに item を開放する必要があります。よって、 DEF_TREE_FUNC_EX( shop_t, shop, pt->free_item() ); などとし、定義元では、 #define DEF_TREE_FUNC_EX( type, name, dest ) \ \ type* free_##name##_at( type* pt )\ {\ if( pt ) {\ dest;\ pt->left = free_##name##_at( pt->left );\ pt->right = free_##name##_at( pt->right );\ }\ return NULL;\ } こんな感じにしておけば、デストラクタの呼び出しが簡単に できてしまいます。 /*========================================================*/ マクロの引き数として Cコードを追加するのは簡単ですが、 終了処理がない場合、引き数を省略するには? マクロの引き数を省略することはできませんが、渡す引き数が C コードならば、C コードとして意味を成さない式を指定すること で、実現可能です。 つまり、;です。 DEF_TREE_FUNC_EX( shop_t, shop, ; ); このようにすると、 shop_t* free_shop_at( shop_t* pt ) { if( pt ) { ;; pt->left = free_shop_at( pt->left ); pt->right = free_shop_at( pt->right ); } return NULL; }; このように変換されますので、問題ありません。 ptがマジックワードとして固定されますが、まぁいいでしょう。 ただし、コンパイラによっては無駄な;を文法エラーとする、 とんでもない非常識(?)な人がいますので、注意が必要です。 MFC 環境なら、気にすることもないでしょう。 /*========================================================*/ カンマ付の Cコードを引き数としてマクロに渡すには? 普通にカンマを含む引き数を指定することはできません。 次のパラメータになってしまいますので。 しかし、それを実現する方法が2つもあります。 1つは、括弧でくくること。たとえば、 test( ( int a, int b ), { a += b, b++; } ); という感じで、括弧で囲ってしまえば、カンマは問題になりま せん。 丸括弧は使いどころが難しいですが、波括弧は使いやすいです。 もう1つの方法は、マクロでくくること。たとえば、 #define A int a, int b #define B a += b, b++; test( A, B ); という感じで、マクロを渡してしまいます。 引き数に指定されたマクロは、マクロ関数が展開された後に 展開されますので、 無事にカンマが渡せます。 /*========================================================*/ カンマを引き数に指定する必要があるのは、木構造の種類に よって、データ構造が違うからです。 文字列ポインタと文字列長をもつタイプは、MSR や LogAnaly などの、テキストを解析して抜き出す処理で使います。 しかし、通常は文字列ポインタは1つで単独でしょう。 または1つの木構造をストリングテーブルとして別格とし、 その文字列ポインタを木構造のキーとして使用することも、 私のツールでは多用します。 よって、 ・ユーザプログラム ・ツリーマスターインターフェース ・ツリーマスターコード という階層を作り、木構造処理のコード本体は1つだけ、 という感じの仕組みにしたいです。 ソースが短ければそれだけ、バグも少ないですから。 それにマクロ関数はデバッグできませんしね。 {magclick} /*========================================================*/ さいごに /*========================================================*/ ちなみに「お水の仕事」とは、水を扱う商売のことです。 飲食店とか。 えっちぃ仕事のことではないのですよ、本当は。 だけど「水は形が不定」だから、 ★「収入の不安定な仕事」 という意味で、えっちぃ業界をさすようになったのです。 本当ですか? {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は7月30日(金曜日)に、第481回をお送りします。 お題は「木構造処理拡張機能」 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 ダブルクリックの選択方法も変えよう なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |