在C中,结构成员可以使用与类型相同的名称吗?
例如,以下是有效的C代码吗在C中,结构成员可以使用与类型相同的名称吗?,c,syntax,struct,C,Syntax,Struct,例如,以下是有效的C代码吗 typedef struct { /* ... */ } foo; typedef struct { foo foo; /* Is it ok that 'foo' == 'foo'? */ } bar; 是的,这是有效的C(尽管它不可读,应该避免) 类型标识符和结构成员标识符位于不同的名称空间中 参见C99,6.2.3p1标识符的名称空间: […]不同类别的标识符有单独的名称空间,如下所示: -标签名称(通过标签声明和使用的语法消除歧义) -结构
typedef struct {
/* ... */
} foo;
typedef struct {
foo foo; /* Is it ok that 'foo' == 'foo'? */
} bar;
是的,这是有效的C(尽管它不可读,应该避免)
类型标识符和结构成员标识符位于不同的名称空间中
参见C99,6.2.3p1标识符的名称空间:
[…]不同类别的标识符有单独的名称空间,如下所示:
-标签名称(通过标签声明和使用的语法消除歧义)
-结构、联合和枚举的标记[…]
-机构或工会的成员;每个结构或联合都有一个单独的名称
其成员的空间[……]
-所有其他标识符,称为普通标识符[…]
你试过编译它吗?不要这样做,仅仅是为了可读性。即使声明字段
struct foo foo
也是不可读的,即使是合法的。有一些易于理解(猜测)的命名约定。它有效(),不可读,请尝试使用foo\u t
或foo
等样式。请参阅例如@TomerArazy,有时您会发现编译器中存在差异,有时是合法的,有时是不合法的。在这里,尝试实际上有些错误;您将获得一种不牢固的信心,即您尝试它时,它的工作方式就是它的工作方式。这句话没有提到typedef
'didentifiers@Matttypedef
标识符是普通标识符。