如果在 c 中的结构中定义,can 枚举的范围有限

Can enums have limited scope if defined inside a struct in c

提问人:xaviersjs 提问时间:10/24/2014 更新时间:10/24/2014 访问量:821

问:

我想知道是否可以通过将枚举放在结构中来限制其访问方式。我知道这在 C++ 中有效(这就是我得到这个想法的地方),但我不知道它是否在 C 中有效。因此,例如,如果我有两个不同的结构

struct SaticArrayA
{
    enum { MAX_SIZE = 10 };
    int array[MAX_SIZE];
};
struct SaticArrayB
{
    enum { MAX_SIZE = 20 };
    int array[MAX_SIZE];
};

这甚至会接近编译吗?基本上,我想做我在 C++ 中会做的事情,并给自己一个跨“类”的通用命名约定,这样我就可以询问任何数组的大小是多少,等等。

(附言我本质上是在尝试给自己一个更好的 c 静态数组,在我尝试将其传递给另一个作用域的那一刻,它不会丢失大小信息(通过衰减到指针)。

c struct enums 命名空间范围

评论

0赞 xaviersjs 10/24/2014
显而易见的替代方法是采用命名约定,并将常量命名为 ,在这种情况下,我可能会使用 a 而不是 .问题是信息是否可以属于结构(不可变)STATIC_ARRAY_A__MAX_SIZE#defineenum

答:

5赞 2501 10/24/2014 #1

它不会编译,

您没有为枚举器提供标记

enum { MAX_SIZE = 10 } name ;

并且您声明了两个同名的枚举器常量

MAX_SIZE

关于识别器范围的 C11 标准:

6.2.1. p7 结构、联合和枚举标签的作用域在 声明标记的类型说明符中的标记。每个枚举常量的作用域 在枚举器列表中出现其定义枚举器之后开始。任何 其他标识符的作用域在其声明器完成后立即开始

这意味着第一个枚举器在整个文件中有一个范围,从声明它的行开始。

具有相同名称的第二个枚举声明不正确,不应编译。

无论在哪里为此规则声明枚举,无论是否为 struct,一旦声明,它们从那时起就处于文件范围内。