You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于C标准N2346::6.7.2.3/p12中相互引用结构体示例上下文敏感性的技术咨询

关于C标准N2346::6.7.2.3/p12示例的疑问

我最近在啃C标准N2346里的6.7.2.3/p12条款,对里面示例2的重点部分完全摸不着头脑,想请教大家:

示例2:为说明如何通过标签的前置声明来指定一对相互引用的结构体,以下声明
struct s1 { struct s2 s2p; / ... */ }; // D1
struct s2 { struct s1 s1p; / ... */ }; // D2
定义了一对包含指向彼此的指针的结构体。但需要注意的是,如果s2标签已在外部作用域中声明,那么声明D1将引用该外部作用域的s2,而非D2中声明的s2。为消除这种上下文敏感性,可在D1之前插入声明struct s2;,这会在当前内部作用域中声明一个新的s2标签,随后D2完成该新类型的定义。

我完全没搞懂这段重点的意思。我自己假设了一种外部作用域已有s2前置声明的场景,写出了这样的代码:

struct s2; // 前置可见声明
struct s1 { struct s2 *s2p; /* ... */ }; // D1
struct s2 { struct s1 *s1p; /* ... */ }; // D2

按照我的理解,这里的声明和定义指定的是同一个类型啊。我还特意去查了N2346::6.7.2.3/p8条款:

如果形如struct-or-union标识符或enum标识符的类型说明符并非上述形式的一部分,且该标识符作为标签的声明可见,则它指定的类型与另一声明的类型相同,且不会重新声明该标签。而该类型即为D2中定义的struct s2 { struct s1 *s1p; /* ... */ };

那标准里说的“在D1之前插入声明以消除上下文敏感性”到底指的是什么?我压根没看出来这里存在什么上下文敏感性啊?

内容的提问来源于stack exchange,提问作者Some Name

火山引擎 最新活动