0

twalk()で使用するグローバルを回避しようとしていますsearch.h

あなたが見ることができるように、関数をコールバックしますが、パラメータtwalkを含めることができませんvoid *

/* Walk the nodes of a tree */
void
twalk(const void *vroot, void (*action)(const void *, VISIT, int))
{
    node *root = (node *)vroot;

    if (root != (node *)0 && action != (void (*)(const void *, VISIT, int))0)
        trecurse(root, action, 0);
}

void
action(const void *nodep, const VISIT which, const int depth)
{
    int *datap;

    switch (which) {
    case preorder:
        break;
    case postorder:
        datap = *(int **) nodep;
        printf("%6d\n", *datap);
        break;
    case endorder:
        break;
    case leaf:
        datap = *(int **) nodep;
        printf("%6d\n", *datap);
        break;
    }
}

自分のファイルで同じ構造体(tsearch.cのnode_t)を同じ名前で再宣言する動作はどうなりますか?

/* twalk() fake */

struct node_t
{
    const void *key;
    struct node_t *left;
    struct node_t *right;
    unsigned int red:1;
};

static void tmycallback(const xdata *data, const void *misc)
{
    printf("%s %s\n", (const char *)misc, data->value);
}

static void tmywalk(const struct node_t *root, void (*callback)(const xdata *, const void *), const void *misc)
{
    if (root->left == NULL && root->right == NULL) {
        callback(*(xdata * const *)root, misc);
    } else {
        if (root->left != NULL) tmywalk(root->left, callback, misc);
        callback(*(xdata * const *)root, misc);
        if (root->right != NULL) tmywalk(root->right, callback, misc);
    }
}

/* END twalk() fake */

if (root) tmywalk(root, tmycallback, "Hello walker");
4

1 に答える 1

0

自分のファイルで同じ構造体(tsearch.cのnode_t)を同じ名前で再宣言する動作はどうなりますか?

C11標準ではそれについて言及されていないようですが、同じ変換単位で構造体を2回宣言しようとすると、多くのコンパイラーが制約違反診断(エラーメッセージ)を発行します。struct node_t宣言を独自のヘッダーファイル(おそらくtree_node.h)に入れ、インクルードガードを使用して宣言の重複を防ぐことをお勧めします。

于 2013-02-26T10:37:08.120 に答える