マクロ定義do-while(0)


たとえば、マクロ定義を使用することが多いが、マクロ定義でdo-while文を使用するなど、テクニックを多くまとめることは少ない.
       
    #define dictSetHashVal(d, entry, _val_) do { \
        if ((d)->type->valDup) \
            entry->val = (d)->type->valDup((d)->privdata, _val_); \
        else \
            entry->val = (_val_); \
    } while(0)>

上記の例はredisソースコードのdict.hから来ており、このマクロの役割はvalDupメソッドが存在する場合、このメソッドを使用して値を設定し、存在しない場合はentry->valに直接値を割り当てることである.しかし、これにはdo-while構造が用いられており、マクロ定義におけるdo-while構造の役割をまとめてみましょう.
1、do-while構造は独立したblockを構成し、複雑な実現を容易にすることができ、例えば変数を定義するなどの操作を行うことができる.
2、特に条件文の後ろでこのテクニックを使うと、マクロ定義が複数の文で構成されている場合、適切なテクニックを採用してblockに包まないと、文法の間違いを引き起こす可能性があります.
上記のマクロ定義では、マクロ定義が次のように定義されている場合、次の操作文が使用されます.
         
    #define dictSetHashVal(d, entry, _val_)  { \
        if ((d)->type->valDup) \
            entry->val = (d)->type->valDup((d)->privdata, _val_); \
        else \
            entry->val = (_val_);  \
    }
  if(true)
        dictSetHashVal(dict,dictEntry,value);
    else
        return -1;

私たちがコンパイルするときにエラーが発生します:expected expression before‘else’これは後ろのセミコロンのため、セミコロンを除いてコンパイルしますが、これは私たちのプログラミング習慣に合わないので、do-while構造に包んでおけば問題はありません.O(∩∩)Oハハ~