我可以命名一个与typedef'd结构名称相同的变量吗?

Fra*_*eng 9 c gcc

这是结构声明代码.

struct list_el {
    int val;
    struct list_el * next;
};

typedef struct list_el item;
Run Code Online (Sandbox Code Playgroud)

当我编写这样的函数时,编译器会出错.它说cur undeclared before first use.

bool delete(item* item)
{
    assert(item != NULL);

    item* cur = NULL;
    cur = head;
    item* prev = NULL;
    while (cur) {
        if (cur == item) {
            if (prev == NULL) {
                head = item->next;
            } else {
                prev->next = item->next;
            }
            free(item);
            return true;
        }

        prev = cur;
        cur = cur->next;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

当我抬头看的参考,它说,typedef作品出来只是有点像#define.它只是在编译时进行替换.这是代码无法编译的原因吗?

Jon*_*ler 17

在这段代码中:

bool delete(item* item)
{
    item *cur = NULL;
Run Code Online (Sandbox Code Playgroud)

item在第三行被取为变量的名称item(参数到功能),而不是类型.因此,第三行看起来好像它是一个item与未定义变量相乘的表达式cur,这会导致问题; 表达的其余部分也是假的.

如果这不是您想要的,请不要对类型和变量使用相同的名称.即使你不把自己和编译器混淆,你也会混淆别人.


无论哪个参考来源说typedef并且#define"相同",现在应该从你的参考文献列表中删除!如果它无法区分两个这样根本不同的结构,那就很危险,因为你不知道它何时会误导你(但这是一个误导你的情况).