代码之家  ›  专栏  ›  技术社区  ›  Filip Navara

指向匿名联合的指针的强制转换在C11中是否有效?

c11 c
  •  7
  • Filip Navara  · 技术社区  · 7 年前
    const Boo *constBoo;
    Boo *nonConstBoo;
    
    nonConstBoo = ((union {const Boo *_q; Boo *_nq;})constBoo)._nq;
    

    上面的构造在C11中是否有效,或者只有gcc/clang扩展才能以这种方式强制转换指向匿名联合的指针?如果它无效,是否有其他方法可以用有效的C11代码编写等效表达式?

    目的是模仿C++COSTYSTCAST,这将是C11兼容,并提供一些基本类型的安全性。从const到non const指针的显式转换将触发带有-wcast qual选项的警告,这是不需要的。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Petr Skocik    7 年前

    Cast to a union 6.5.4p2

    typedef struct Boo Boo;
    const Boo *constBoo;
    Boo *nonConstBoo;
    
    int main()
    {
        nonConstBoo = (union {const Boo *_q; Boo *_nq;}){._q=constBoo}._nq;
    }
    

    6.2.5p28

    memcpy(&nonConstBoo,&constBoo,sizeof constBoo);
    

        2
  •  4
  •   Petr Skocik    7 年前

    union

    const (Boo*)constBoo