C で反復子関数をラップするマクロの例を次に示します。
マクロ定義:
/* helper macros for iterating over tree types */
#define NODE_TREE_TYPES_BEGIN(ntype) \
{ \
GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \
for (; !BLI_ghashIterator_done(__node_tree_type_iter__); BLI_ghashIterator_step(__node_tree_type_iter__)) { \
bNodeTreeType *ntype = BLI_ghashIterator_getValue(__node_tree_type_iter__);
#define NODE_TREE_TYPES_END \
} \
BLI_ghashIterator_free(__node_tree_type_iter__); \
} (void)0
使用例:
NODE_TREE_TYPES_BEGIN(nt)
{
if (nt->ext.free) {
nt->ext.free(nt->ext.data);
}
}
NODE_TREE_TYPES_END;
ただし、ネストされた使用 (機能している間) は、シャドウイング (gcc の-Wshadow
)を引き起こします
NODE_TREE_TYPES_BEGIN(nt_a)
{
NODE_TREE_TYPES_BEGIN(nt_b)
{
/* do something */
}
NODE_TREE_TYPES_END;
}
NODE_TREE_TYPES_END;
これを回避するために考えられる唯一の方法は、一意の識別子をNODE_TREE_TYPES_BEGIN
andに渡すことNODE_TREE_TYPES_END
です。だから私の質問は...
スコープがネストされているときに変数がイテレータ マクロ内で宣言されている場合、シャドウイングを防ぐ方法はありますか?