2017/06/29

[c/c++]マクロは再評価されない

プロトコルのエンコードとデコードの処理を書いていた。
動いていたのだけど、仕様変更により、一部のビット数が変更になった。

バイナリで決まったところに決まったデータ長を使用するプロトコルだったので、ビット数を変更し、エンディアン変換もあったので変更したビット数に対応した関数に変更することで動いた。


が、こういうのってもう少し簡単に書けないだろうか。
protobufみたいなものは使えないのだけど、pack(0)した構造体をメモリごと渡せるようなものでもない。
だから、ちまちまと変換しているのだ。


でも、ある程度ならマクロでもできるんじゃないの?と思って書いてみた。

#include 
#include 
#include 

#define TYPE(bit)       uint ## bit ## _t
#define FUNC(bit)       func ## bit
#define PRI(bit)        PRIu ## bit

void func16(void)
{
    printf("%s()\n", __func__);
}

void func32(void)
{
    printf("%s()\n", __func__);
}

void func64(void)
{
    printf("%s()\n", __func__);
}

int main(void)
{
    TYPE(64)       a;
    a = 123;
    printf("a=%" PRI(64) "\n", a);

    FUNC(64)();

    return 0;
}


この程度までのマクロ使いであれば動いた。

ここまでやったら、引数の64もマクロにしたくなるのが生き物というものだろう?
だが、それはダメだった。
それがタイトルの「マクロは再評価されない」だ。


オライリーのC言語クリックリファレンス本に書いてあったのだが、まあ間違いなかろう。
実際、ダメだし。

よい方法はなさそうだし、かといってあちこちにマジックナンバーがちらばっていても返って分かりづらいので、ここでマクロを使うのは止めた。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。