C++标准中结构命名空间标识符的分类及主表达式允许场景问询
关于C++中结构体成员在sizeof中直接引用的标准细节
先看这段在C++合法但C中不合法的代码:
struct s { int x; int y[sizeof x]; };
一、x这类标识符的分类
在C里,x是结构体s的类成员标识符——因为C中struct属于类类型的一种,所以x隶属于s的类作用域。在结构体定义内部,从x的声明点开始,它的作用域就覆盖了结构体剩余的定义部分,不需要额外限定符就能直接引用。它不属于命名空间标识符,而是类(结构体)作用域下的成员名字。
二、C++标准允许这类标识符作为主表达式的依据
C++标准中,主表达式的标识符引用规则(对应标准条款[expr.prim.id])明确:在类定义的上下文里,当处理类成员的声明时,只要某个成员已经被声明过(比如这里的x在y之前声明),该成员的名字就可以直接作为主表达式使用,包括作为sizeof的操作数。
具体来说,在类的非静态数据成员声明过程中(比如这里数组y的大小指定),类的作用域是逐步展开的——从第一个成员的声明开始,后续成员可以直接引用之前已声明的成员,这是C++为支持这类灵活的结构体定义特意规定的。
而C语言(比如C23标准)要求标识符主表达式必须是可见的普通对象/函数标识符,结构体成员在结构体定义内部不属于这类“普通标识符”,因此无法直接使用sizeof x这种写法。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

