2010-04-06 95 views
8

的typedef的语法我有一个问题,在C语言中的typedef关键字。语法与C语言

在我的计划,我用下面的代码:

typedef int* a[10]; 

int main(){ 
int a[10]; 
} 

他们工作得很好。但是为什么变量和类型之间没有冲突?

问候。

+0

很酷的问题 - 我从来没有真正考虑过这个。您定义的类型虽然很可笑,但我希望它仅用于演示目的:-) – 2010-04-06 11:57:33

+0

您是对的,我不希望我的代码难以阅读为拼图。 :-) – 2010-04-06 12:05:57

+0

哇,海湾合作委员会甚至可以与“一个;”。 (只要它是主要的,不是全球的) – 2010-04-06 12:28:23

回答

6

msdn C language reference

typedef名称共享与普通的标识符(见Name Spaces了解更多信息)的名称空间。因此,程序可以使用同名的typedef名称和本地范围标识符。

+1

好奇的报价。快速阅读它感觉像一个矛盾。如果他们共享一个名字空间,他们怎么会有相同的名字?这是因为*本地范围*? – 2010-04-06 11:56:25

+0

嗯......您指向的“名称空间”链接指出:“Typedef名称不能在同一范围内用作标识符。” – 2010-04-06 12:03:55

+3

@Eli:'{int x; {float x;}}' – sbi 2010-04-06 12:04:43

6

C标准说(第6.2.1节 - 标识符的范围):

的标识符可以表示的对象;一个 函数;标签或 结构,联合或枚举的成员;一个 typedef名称;标签名称;宏名称 ;或宏参数。相同 标识符可以在 程序表示在不同的点不同 实体。

ķ& R2说(A.11.1 - 词法范围)

标识符分成几个名字 空间,不与一个 彼此干扰;相同的标识符可以是用于不同的目的 ,即使在 同一范围,如果它们的用途是在 不同的名字空间。这些类 是:对象,函数,类型定义 名称和枚举常量;标签; 结构或联合的标签,和 枚举;和每个 结构或联合的成员单独。

我必须承认,这让我困惑。读第二个引号它出现变量名和typedef -ed类型应该冲突。

+0

但是我还不是很清楚在前面的代码中怎么能表示不同的实体共存。你能给我进一步的解释吗?谢谢。 – 2010-04-06 12:08:28

+1

@尼尔:我读了不同的标点符号。看起来像对象,函数,typedef名称和枚举常量是一个类。接下来(分号后)标签,下一个标签等。 – 2010-04-06 12:31:00

3

变量和类型定义占据相同命名空间,并能有完全相同的范围内其它标识符共享名称。

但是,您的第二个a位于main之内,适用范围规则:第二个a覆盖第一个。

你可以做同样的事情只是简单的变量:

int a; 

int main() { 
    int a; 
} 

你会发现,如果你移动之外主要的变量声明,该程序将无法编译。