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

这是结构声明代码。

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

在这段代码中:

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

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

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


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

typedef只是已存在类型的新名称。 定义由预处理器处理,而typedef由C编译器本身处理。 [从此链接复制]

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

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 } 

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

Jonathan Leffler回答你的问题。

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

 struct list_el { int val; list_el *next; }; bool delete_element(list_el *item) { list_el *cur = NULL; ... }