【问题标题】:Can enums have limited scope if defined inside a struct in c如果在 c 中的结构内定义,枚举的范围是否有限
【发布时间】:2014-12-20 06:22:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 显而易见的替代方法是采用命名约定,并将常量命名为STATIC_ARRAY_A__MAX_SIZE,在这种情况下,我可能会使用#define 而不是enum。问题是信息是否可以属于结构(不可变)

标签: c struct enums namespaces scope


【解决方案1】:

它不会编译,

你没有给枚举器一个标签

enum { MAX_SIZE = 10 } name ;

你声明了两个同名的枚举器常量

MAX_SIZE

关于标识符范围的 C11 标准:

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

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

第二个同名枚举声明不正确,不应编译。

在哪里为这个规则声明枚举无关紧要,结构与否,一旦声明它们从那时起就在文件范围内。

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多