マクロ定義do-while(0)
たとえば、マクロ定義を使用することが多いが、マクロ定義でdo-while文を使用するなど、テクニックを多くまとめることは少ない.
上記の例はredisソースコードのdict.hから来ており、このマクロの役割はvalDupメソッドが存在する場合、このメソッドを使用して値を設定し、存在しない場合はentry->valに直接値を割り当てることである.しかし、これにはdo-while構造が用いられており、マクロ定義におけるdo-while構造の役割をまとめてみましょう.
1、do-while構造は独立したblockを構成し、複雑な実現を容易にすることができ、例えば変数を定義するなどの操作を行うことができる.
2、特に条件文の後ろでこのテクニックを使うと、マクロ定義が複数の文で構成されている場合、適切なテクニックを採用してblockに包まないと、文法の間違いを引き起こす可能性があります.
上記のマクロ定義では、マクロ定義が次のように定義されている場合、次の操作文が使用されます.
私たちがコンパイルするときにエラーが発生します:expected expression before‘else’これは後ろのセミコロンのため、セミコロンを除いてコンパイルしますが、これは私たちのプログラミング習慣に合わないので、do-while構造に包んでおけば問題はありません.O(∩∩)Oハハ~
#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ハハ~