当 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
。这是不允许的。
这是由于他们调用的范围的解析。在第一个代码中,您使用了两个相同的名称但在不同的范围内,因此它们被视为不同的并且局部变量获得优先权。
在第二种情况下,作用域是相同的全局变量,因此编译器不允许声明两个具有不同数据类型的相同命名变量。
当我编译第一个代码时,我没有收到任何错误
#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
。这是不允许的。
这是由于他们调用的范围的解析。在第一个代码中,您使用了两个相同的名称但在不同的范围内,因此它们被视为不同的并且局部变量获得优先权。 在第二种情况下,作用域是相同的全局变量,因此编译器不允许声明两个具有不同数据类型的相同命名变量。