如果在c中的结构内定义,枚举可以限制范围

xav*_*sjs 4 c enums struct scope namespaces

我想知道枚举是否可以通过将它放在结构中来限制它的访问方式.我知道这可以在C++中工作(这就是我得到的想法),但我不知道它是否适用于c.所以,例如,如果我有两个不同的结构

struct SaticArrayA
{
    enum { MAX_SIZE = 10 };
    int array[MAX_SIZE];
};
struct SaticArrayB
{
    enum { MAX_SIZE = 20 };
    int array[MAX_SIZE];
};
Run Code Online (Sandbox Code Playgroud)

这甚至接近编译?基本上,我想做我将在C++中做的事情并给自己一个跨"类"的通用命名约定,以便我可以询问任何数组的大小是什么,等等.

(ps我本质上是想在c中给自己一个更好的静态数组,它不会丢失大小信息(通过衰减到指针)第二次我尝试将它传递给另一个范围).

250*_*501 5

它不会编译,

你没有给枚举者一个标签

enum { MAX_SIZE = 10 } name ;
Run Code Online (Sandbox Code Playgroud)

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

MAX_SIZE
Run Code Online (Sandbox Code Playgroud)

关于标识范围的C11标准:

6.2.1.p7结构,联合和枚举标记的范围在声明标记的类型说明符中标记出现之后开始.每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.任何其他标识符的范围都在其声明者完成之后开始

这意味着您的第一个枚举器在整个文件中的范围从它向前声明的行开始.

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

对于此规则,struct或者声明枚举的位置无关紧要,一旦声明它们从那一点开始就处于文件范围内.