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

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

最佳答案

在这段代码中:

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

第三行中的 item 是变量 item 的名称(函数的参数),而不是类型。因此,第三行看起来好像开始时是一个将 item 乘以 undefined variable cur 的表达式,这会导致问题;表达式的其余部分也是伪造的。

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


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

关于我可以命名一个与 typedef 结构名称同名的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13374497/

相关文章:

c - 访问负索引处的数组元素

c - 如何将 char 赋值给 int 值?

ubuntu - 如何从外部文件读取gcc输入

c - 检查文本文件是否恰好包含N个整数

C 编程 - 免费方法给我一个无效的下一个大小(快速)错误

c - "Thread1:signal SIGABRT"上的错误消息 "return 0"

gcc - 如何在代码块上添加编译器标志

c++ - 使用 g++ 和 clang++ 对 condition_variable 进行虚假唤醒

c++ - 为什么 gcc 不给我警告或错误?

linux - _GLOBAL_OFFSET_TABLE 是什么?