这是结构声明代码。
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
。它只是在编译时进行替换。这是代码无法编译的原因吗?
答案 0 :(得分:17)
在此代码中:
bool delete(item* item)
{
item *cur = NULL;
第三行中的item
被视为变量item
(函数的参数)的名称,而不是类型。因此,第三行看起来好像是一个表达式,它将item
乘以未定义的变量cur
,这会导致问题;表达的其余部分也是假的。
如果这不是您想要的,请不要对类型和变量使用相同的名称。即使你不把自己和编译器混淆,你也会混淆别人。
无论哪个参考来源表示typedef
和#define
'相同',都应该从您的参考列表中删除 now !如果它无法区分两个这样根本不同的结构,那就很危险,因为你不知道什么时候会误导你(但这是一个误导你的情况)。
答案 1 :(得分:2)
typedef只是现有类型的新名称。定义由预处理器处理,而typedef由C编译器本身处理。 [从此link]
复制而来答案 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;
...
}