2010-11-11 79 views
3

嗨全部 我只是想知道我们是否可以声明变量名称作为结构名称。结构类型和变量名称

例如

typedef struct 
{ 
    char c; 
}t; 

然后在一些功能我可以用

fun() 
{ 
    t t; 
} 

是这有效吗?如果是这样,那么编译器如何区分它们?

+0

您可以随时编译它......我认为编译器将能够区分,因为您可以知道变量/对象何时被声明与读取/写入/等等。 – 2010-11-11 04:30:15

+1

@muntoo,你可以编译它,但是它不会告诉你它是否有效,只是它是否在你的编译器中起作用。 – 2010-11-11 04:33:41

+0

当然,如果精神病患者是看着你的代码的下一个人... ... – 2010-11-11 04:41:56

回答

3

是的,它是有效的。如果这样做,那么结构类型将隐藏在封闭范围内,并且t仅引用声明的变量。

0

是的,因为每个事物在编译器的理解中都处于不同的位置。

t t; 

编译器在遇到第一个t时期待一个类型,并且它有一个类型叫做t。

编辑:为了解决评论。

我不是在谈论范围。

但是由于我没有编写一个编译器(只有解释器),我不知道这个术语。编译器期望第一个t的一个标记是一个类型,它也知道到那时为止已经声明了什么类型。因为它看到一个名称,指的是一种类型,它很高兴。而如果在那里找到一个不是类型的令牌,那么它会正确地发出错误信号。

+0

-1,因为你的理由是错误的。 'typedef'和变量名在相同的范围内。 – 2010-11-11 08:43:43

+0

术语是它们是不同类型的标记。 – Praxeolitic 2014-09-04 04:12:02

1

fun() { t t; }

是这有效吗?

不,它不是。返回类型fun()缺失且隐含int返回类型已弃用。

但是void fun(){ t t ;}在语法上是有效的。

3

是的,但你为什么要?如果你想在你的项目中发现错误和错误,那么就直接提出并在类型之后命名变量。

+2

布拉沃,只是因为某些东西是有效的,这并不是一个好主意。 – paxdiablo 2010-11-11 04:54:04

0

解析器首先获取数据类型,并维护一个不同的表和后面的部分作为变量名。所以它绝对有效。