C 的 K&R 和 Microsoft 语法表明了这个简单的结构:
struct { int a ; } ;
在解析时匹配
declaration
:
declaration
declarationSpecifier ';'
typeSpecifier ';'
structOrUnionSpecifier ';'
structOrUnion '{' structDeclarationList '}' ';'
'struct' '{' structDeclaration '}' ';'
'struct' '{' specifierQualifierList structDeclaratorList ';' '}' ';'
'struct' '{' typeSpecifier structDeclarator ';' '}' ';'
'struct' '{' 'int' declarator ';' '}' ';'
'struct' '{' 'int' directDeclarator ';' '}' ';'
'struct' '{' 'int' identifier ';' '}' ';'
'struct' '{' 'int' 'a' ';' '}' ';'
因此是合法的。但是如果我们将它嵌套在另一个结构中,例如
struct { struct { int a ; } ; } ;
解析变成:
declaration
declarationSpecifier ';'
typeSpecifier ';'
structOrUnionSpecifier ';'
structOrUnion '{' structDeclarationList '}' ';'
'struct' '{' structDeclaration '}' ';'
'struct' '{' specifierQualifierList structDeclaratorList ';' '}' ';'
'struct' '{' typeSpecifier structDeclarator ';' '}' ';'
'struct' '{' structOrUnionSpecifier declarator ';' '}' ';'
'struct' '{' structOrUnion '{' structDeclarationList '}' directDeclarator ';' '}' ';'
'struct' '{' 'struct' '{' structDeclaration '}' identifier ';' '}' ';'
此时正在强制使用
identifier
,而我们不想要像 struct{struct{int a;}b;};
中那样的位置,但如果我们忽略该规则并省略 b
,那么 struct{struct{int a;};};
仍然可以毫无问题地编译。
当语法表明需要额外的
struct{struct{int a;};};
时,identifier
如何以及为什么可以编译?我是否误解了语法,或者实际的语法不是我想象的那样?
参考 K&R 第 193 页(ANSI 版本)
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
type specifier: one of
void char short int long float double signed
unsigned struct-or-union-specifier enum-specifier typedef-name
类型说明符的元素之一是struct-or-union。声明说明符是递归的且可选的,因此您可以嵌套未命名的结构。