讨论的动机
C++类的语法定义为
class-key identifier *[opt]* base-clause *[opt]* (斜体是我的)
这对我来说意味着类名是选项,我们可以在C++中使用未命名的类.
那么,以下是否良好?
struct X{
struct{
int x;
int y;
};
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
VS:错误C2467:非法声明匿名'struct'
Comeau online:error:声明没有声明任何结构{
GCC(ideone):编译好
有什么想法吗?
不,它没有良好的形式.您无法单独从这些语法语句中派生语言语法.标准文本中给出的额外要求也必须予以考虑.在这种情况下,这将是
7声明
...
3 在一个简单声明中,只有在声明一个类(第9节)或枚举(7.2)时,也就是说,当decl-specifier-seq 包含一个类说明符时, 可以省略可选的init-declarator-list.elaboratedtype-specifier,带有 类键(9.1)或枚举说明符.在这些情况下,只要 在decl-specifier-seq中存在类说明符或枚举说明符,这些说明符中的标识符就是声明声明的名称(作为类名, 枚举名)或枚举器,具体取决于语法).在这种情况下,除了声明未命名的位字段(9.6)之外, decl-specifier-seq应在程序中引入一个或多个名称,或者重新声明由先前声明引入的名称.
最后一句是在这种情况下重要的一句话
"可选"部分仅用于允许声明
struct { int x; } s;
typedef struct { int x, y; } Point;
Run Code Online (Sandbox Code Playgroud)
第一个声明类型没有s该类型的链接和变量.请注意,没有链接的类型不能用于声明具有链接的变量,这意味着此类声明不能在命名空间范围中使用.
你的例子是不正确的,但这是合法的
struct X {
struct {
int x;
int y;
} point;
};
Run Code Online (Sandbox Code Playgroud)
此外,无名类语法用于声明匿名联合(虽然我对7/3没有提到匿名联合的事实感到有点困惑).