在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标识符的名称空间: […]不同类别的标识符有单独的名称空间,如下所示: -标签名称(通过标签声明和使用的语法消除歧义) -结构

例如,以下是有效的C代码吗

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@Matt
typedef
标识符是普通标识符。