我试图理解标准中的一些例子是什么意思。
N2346::6.7.2.3/p12
(我的):
示例 2为说明使用标签的事先声明来指定一对相互引用的结构,声明
struct s1 { struct s2 *s2p; /* ... */ }; // D1 struct s2 { struct s1 *s1p; /* ... */ }; // D2
指定一对包含彼此指针的结构。但是请注意,如果
s2
已经在 封闭范围内D1
声明为标记,则声明将引用它,而不是在 中声明的标记。为了消除这种上下文敏感性,s2
D2
声明struct s2;
可以提前插入
D1
。这s2
在内部范围内声明了一个新标签;D2
然后声明完成了新类型的规范。
我真的不明白强调的部分是什么意思。
如果s2
在封闭范围内声明一个标签,例如如下:
struct s2; //previous visible declaration
struct s1 { struct s2 *s2p; /* ... */ }; // D1
struct s2 { struct s1 *s1p; /* ... */ }; // D2
然后声明和定义都将指定相同的类型。N2346::6.7.2.3/p8
:
如果表单的类型说明符
struct-or-union identifier
或者
enum identifier
不是作为上述形式之一的一部分发生,并且标识符作为标记的声明是可见的,那么它指定与其他声明相同的类型,并且不重新声明标记。
类型是在 处struct s2 { struct s1 *s1p; /* ... */ };
定义的D2
。
那么标准通过在前面插入声明D1
来消除上下文敏感性有什么作用。我在这里没有看到任何上下文敏感性。
您创建的示例只有一个作用域。为了证明他们的观点,您需要有一个嵌套的作用域。例如,以下完整程序演示了这一点:
#include <stdio.h>
struct foo {
int a;
};
int main(void)
{
struct bar {
int b;
struct foo *ptr;
};
struct foo {
int c;
struct bar *ptr;
};
struct bar x;
printf("%zu %zu\n", sizeof(struct foo), sizeof(*x.ptr));
return 0;
}
当我在我的系统上运行它时,我得到:
16 4
这两个大小不同的原因是因为第一个大小来自 的本地定义struct foo
,而struct bar
使用的是先前声明的 全局定义struct foo
,因为 的定义struct bar
先于 的本地定义struct foo
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句