没有名字的课

Class with no name

本文关键字:      更新时间:2023-10-16

我在C 标准文档中阅读了有关类的阅读:

类是一种类型。它的名称变成了class-name(9.1) 范围。

class-name: identifier template-id

我找到了C 标准中标识符的语法:

 2.10 Identifiers
 identifier: nondigit
 identifier nondigit
 identifier digit
 nondigit: one of universal-character-name 
 _ a b c d e f g h i j k l m n o p q r s t u  v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
 digit: one of 0 1 2 3 4 5 6 7 8 9

现在我尝试这样做:

class
{
public:
  int i;
};

它可以很好地编译,没有任何名称。

有人可以给我一个解释吗?这不是违反针对标识符的语法吗?


纳瓦兹(Nawaz)提出了有关我给出的代码标准符合性的后续问题。那些有兴趣的人可以在这里检查一下。

语法

class-specifier:
    class-head { member-specification_opt }
class-head:
    class-key attribute-specifier-seq_opt class-head-name class-virt-specifier-seq_opt base-clause_opt
    class-key attribute-specifier-seq_opt base-clause_opt
class-key:
    class
    struct
    union

在您的情况下,使用了class-head的第二次生产 - 不涉及class-name

标识符被完全省略,因此标识符正确的语法问题是毫无根据的。描述中没有任何内容表明标识符必须存在。匿名类可能允许与C结构规则保持一致,该规则允许诸如:

之类的结构。
typedef struct { int i; } Foo;
struct { int x, y; } points[] = { {1, 2}, {3, 4} };

我认为我从未见过这堂课。

class {public: int i;}

是没有用的,但是您可以在没有名称的情况下指定一堂课,然后创建此类的实例。知道您可以使用以下内容:

class {public: int i;} a,b,c;
a.i = 5;
b.i = 4;
c.i = 3;
cout<<a.i<<" "<<b.i<<" "<<c.i;

您也可以在功能中使用此功能(作为一个厌食类),因此知道您可以使用类似的东西:

void x()
{
    class {public: int i;} a,b,c;
    a.i = 5;
    b.i = 4;
    c.i = 3;
    cout<<a.i<<" "<<b.i<<" "<<c.i;
}
int main() {
    x();
}

代码 class { int i; };是完全标准的。

相关文章:
  • 没有找到相关文章