10

这是结构声明代码。

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

typedef struct list_el item;

当我编写这样的函数时,编译器会出错。它说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;
}

typedef在我查阅参考资料后,它说的结果有点像#define. 它只是在编译时进行替换。这是无法编译代码的原因吗?

4

5 回答 5

17

在这段代码中:

bool delete(item* item)
{
    item *cur = NULL;

第三行item中的 the 被认为是变量的名称item(函数的参数),而不是类型。因此,第三行看起来好像是一个item与未定义变量相乘的表达式cur,这会导致问题;其余的表达也是假的。

如果这不是您想要的,请不要为类型和变量使用相同的名称。即使您不混淆自己和编译器,您也会混淆其他人。


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

于 2012-11-14T07:19:50.873 回答
2

typedef 只是现有类型的新名称。定义由预处理器处理,而 typedef 由 C 编译器本身处理。[从这个链接 复制]

检查这个问题:typedef 和 #define 在 c 中是否相同?

于 2012-11-14T07:28:29.493 回答
1

typedef不完全一样#define

以下是示例的区别:

#define cptr1 char*

typedef char* cptr2;

在代码中:

           int main()
            {
             cptr1 c1,c2; // first case : 
        // here c1 will be pointer to char but c2 is only char as cptr 
   // is directly replaced by char* by preprocessor
            cptr2 c3,c4; // second case :
      // here c3 and c4 both are pointers to char 
            }
于 2012-11-14T07:25:31.560 回答
1

您应该-Wshadow在编译代码时使用。然后,gcc 会告诉你哪里错了。:-) 如下:
declaration of ‘item’ shadows a global declaration [-Wshadow]

于 2012-11-14T07:38:55.823 回答
1

Jonathan Leffler 回答了你的问题。

我只想补充一点:如果你用 C++ 编写代码,你不需要 typedef,所以你可以像这样实现你的列表:

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

bool delete_element(list_el *item)
{
    list_el *cur = NULL;
    ...
}
于 2012-11-14T07:40:08.877 回答