澄清C11标准中的工会示例

凯尔

以下示例在C11标准6.5.2.3中给出

以下不是有效的片段(因为在函数f中看不到联合类型):

struct t1 { int m; };
struct t2 { int m; };
int f(struct t1 *p1, struct t2 *p2)
{
   if (p1->m < 0)
   p2->m = -p2->m;
   return p1->m;
}
int g()
{
   union {
      struct t1 s1;
      struct t2 s2;
   } u;
   /* ... */
   return f(&u.s1, &u.s2);
}

为什么对函数f可见联合类型很重要?

在仔细阅读了相关部分几次后,我在包含部分中看不到任何不允许这样做的内容。

基思·汤普森(Keith Thompson)

这很重要,因为有6.5.2.3第6段(添加了重点):

为了简化并集的使用,做出了一项特殊保证:如果并集包含多个具有共同初始序列的结构(请参见下文),并且如果并集对象当前包含这些结构之一,则可以检查该并集。在联合的完整类型的声明可见的任何地方的初始部分如果相应成员对一个或多个初始成员的序列具有兼容的类型(对于位域,则具有相同的宽度),则两个结构共享一个公共的初始序列

这不是需要诊断的错误(语法错误或约束冲突),但行为未定义,因为对象m成员占用相同的存储空间,但是由于是不同类型,允许编译器假定它们没有相同的行为。 t-特别是对的更改不会影响的值例如,编译器可以在第一次访问时in的值保存在寄存器中,然后在第二次访问时不从内存中重新加载它的值。struct t1struct t2struct t1struct t2p1->mp2->mp1->m

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C11标准文档

来自分类Dev

在C11和C ++ 11中转换UTF-8的标准方法?

来自分类Dev

C工会的命名标准

来自分类Dev

为什么C标准C11在gcc中不是默认值?

来自分类Dev

尝试解析C11标准中的常用算术转换规则

来自分类Dev

新标准C11(不是C ++ 11)中是否有constexpr或计划在将来使用?

来自分类Dev

如何在Code :: Blocks中使用C11标准

来自分类Dev

替换SIGUSR1信号处理程序在标准C11和GNU11中的工作方式不同

来自分类Dev

在C11中使用strdup

来自分类Dev

在C11之后,有没有计划制定未来的C标准?

来自分类Dev

在没有C11线程的情况下,C标准库函数是否是线程安全的?

来自分类Dev

为什么C11标准不会丢弃不安全的strcat(),strcpy()函数?

来自分类Dev

C11中“可代表”是什么意思?

来自分类Dev

C11中类型名称范围的概念

来自分类Dev

在C11中什么算作字符类型?

来自分类Dev

C11中类型名称范围的概念

来自分类Dev

在C11中,“ *”(星号)是否是关键字?

来自分类Dev

在C11中输出参数还是返回struct?

来自分类Dev

C11中的Pthread_create函数

来自分类Dev

C11中的pthread_attr_t等效项

来自分类Dev

C中工会的自由结构

来自分类Dev

Javascript强制示例中需要澄清

来自分类Dev

C11 Unicode支持

来自分类Dev

在C ++中澄清[[pure]]

来自分类Dev

C ++模板声明中的范围和默认参数:澄清标准版

来自分类Dev

如何解释C11标准第6.3.2.3部分第7部分?

来自分类Dev

如何解释C11标准第6.3.2.3部分第7部分?

来自分类Dev

c11 标准 6.7.2.3 标签 一个特定类型的内容最多定义一次

来自分类Dev

澄清c。/ C99标准措辞的更改