1

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_BEGINandに渡すことNODE_TREE_TYPES_ENDです。だから私の質問は...

スコープがネストされているときに変数がイテレータ マクロ内で宣言されている場合、シャドウイングを防ぐ方法はありますか?

4

1 に答える 1