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

时间:2012-11-14 07:16:57

标签: c gcc

这是结构声明代码。

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。它只是在编译时进行替换。这是代码无法编译的原因吗?

5 个答案:

答案 0 :(得分:17)

在此代码中:

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

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

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


无论哪个参考来源表示typedef#define'相同',都应该从您的参考列表中删除 now !如果它无法区分两个这样根本不同的结构,那就很危险,因为你不知道什么时候会误导你(但这是一个误导你的情况)。

答案 1 :(得分:2)

typedef只是现有类型的新名称。定义由预处理器处理,而typedef由C编译器本身处理。 [从此link]

复制而来

检查此问题:Are typedef and #define the same in c?

答案 2 :(得分: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 
            }

答案 3 :(得分:1)

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

答案 4 :(得分:1)

Jonathan Leffler回答你的问题。

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

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

bool delete_element(list_el *item)
{
    list_el *cur = NULL;
    ...
}