C++ 不带typedef或名称的枚举

C++ 不带typedef或名称的枚举,c++,c,contiki,C++,C,Contiki,我正在努力理解一些开源代码 我遇到了一行类似于 enum { Thing1, Thing2, }; 我想知道这个枚举是如何工作的?它没有名称或typedef 代码的实际行可以在第125-128行中找到。此结构可用于实际值不感兴趣的命名常量,唯一的要求是常量的值不同。此结构可用于实际值不感兴趣的命名常量,唯一的要求是这是一个传统的匿名枚举。传统枚举将其符号导出到封闭的命名空间: namespace a{ enum { Thing1, // a::Thing1 Thin

我正在努力理解一些开源代码

我遇到了一行类似于

enum {
   Thing1,
   Thing2,
};
我想知道这个枚举是如何工作的?它没有名称或typedef


代码的实际行可以在第125-128行中找到。

此结构可用于实际值不感兴趣的命名常量,唯一的要求是常量的值不同。

此结构可用于实际值不感兴趣的命名常量,唯一的要求是这是一个传统的匿名枚举。传统枚举将其符号导出到封闭的命名空间:

namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};
}
namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};

enum namedEnum {
    Thing1, // Error!
    Thing2, // Error!
};
}
因此,在此匿名枚举中,不需要指定枚举名称来引用其成员,但由于将符号导出到封闭命名空间的行为,可能会导致名称冲突:

namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};
}
namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};

enum namedEnum {
    Thing1, // Error!
    Thing2, // Error!
};
}

这是一种传统的匿名枚举。传统枚举将其符号导出到封闭的命名空间:

namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};
}
namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};

enum namedEnum {
    Thing1, // Error!
    Thing2, // Error!
};
}
因此,在此匿名枚举中,不需要指定枚举名称来引用其成员,但由于将符号导出到封闭命名空间的行为,可能会导致名称冲突:

namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};
}
namespace a{
enum {
    Thing1, // a::Thing1
    Thing2, // a::Thing2
};

enum namedEnum {
    Thing1, // Error!
    Thing2, // Error!
};
}

这是一个匿名的枚举。
Thing1
Thing2
的作用域与枚举本身的作用域相同。它们分别有0和1个int值,这是一个匿名枚举。
Thing1
Thing2
的作用域与枚举本身的作用域相同。它们分别有0和1个int值,这与枚举数的值无关<代码>枚举{Thing1=0,Thing2=0}非常好。这只意味着您无法创建该类型的命名对象,因为该类型没有名称:
enum MyThings{Thing1,Thing2};神话我的东西=东西1--如果没有
神话
就不能这样做。@PeteBecker嗯,我认为很明显,你不能创建匿名类型的对象。但我清楚地记得,这是用于像
enum{Val1=10,Val2=11}
这样的常数的,可以免费进行重复检查。
enum
类型允许其枚举数具有重复的值。试试看。@PeteBecker:对。该死只有在不手动指定值的情况下,才能获得这种安全性。好吧,我的错。这与枚举数的值无关<代码>枚举{Thing1=0,Thing2=0}非常好。这只意味着您无法创建该类型的命名对象,因为该类型没有名称:
enum MyThings{Thing1,Thing2};神话我的东西=东西1--如果没有
神话
就不能这样做。@PeteBecker嗯,我认为很明显,你不能创建匿名类型的对象。但我清楚地记得,这是用于像
enum{Val1=10,Val2=11}
这样的常数的,可以免费进行重复检查。
enum
类型允许其枚举数具有重复的值。试试看。@PeteBecker:对。该死只有在不手动指定值的情况下,才能获得这种安全性。好吧,我的错。