当 typedef 是全局而非局部时,为什么定义与函数同名的 typedef 会出错?

Why does defining a typedef with the same name as a function give an error when the typedef is global but not local?

当我编译第一个代码时,我没有收到任何错误

#include <stdio.h>

void bool_t(void)
{
    printf("This is a test\n ");
}

int main()
{
    typedef enum bool_t
    {
        false=0,true=1
    } bool_t;

    bool_t x = true;

    return 0;
}

但是当我编译第二个代码时出现错误

#include <stdio.h>

void bool_t(void)
{
    printf("la valeur est ");
}

typedef enum bool_t
{
    false=0,true=1
} bool_t;

int main()
{
    bool_t x = true;

    return 0;
}

错误是

error: ‘bool_t’ redeclared as different kind of symbol

我真的很想了解第一段和第二段代码中到底发生了什么,以便更多地了解这两种实现的行为,因为我认为自己是 C 语言的初学者!

在第一种情况下,您的重写全局 bool_t 函数具有本地枚举类型 bool_t

但在第二种情况下,您在全局范围内声明了两次 bool_t,这是编译器指出的错误。

在第一种情况下,bool_t 是在函数范围内声明的,因此它 shadows 来自外部范围的声明。这很有用,因为这意味着向外部范围添加独立符号不会使您的函数无效。

在第二种情况下,您在同一范围(全局范围)中声明了两次 bool_t。这是不允许的。

这是由于他们调用的范围的解析。在第一个代码中,您使用了两个相同的名称但在不同的范围内,因此它们被视为不同的并且局部变量获得优先权。 在第二种情况下,作用域是相同的全局变量,因此编译器不允许声明两个具有不同数据类型的相同命名变量。