メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.480) マクロ応用など  2004/07/28


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。