c/c++开发分享没有命名成员的struct在哪里有用?

C标准为何以及在何处允许此代码编译? 它在哪里有用?

struct foo { int : 12; }; 

    (adsbygoogle = window.adsbygoogle || []).push({});

    这将在§6.7.2.1 结构和联合说明符中

    12)没有声明符但只有冒号和宽度的位字段声明表示未命名的位字段。 126

    脚注解释了为什么存在这样的事情:

    126未命名的位字段结构成员可用于填充以符合外部强加的布局。

    话虽如此,标准的同一部分(第8段)也指出:

    如果struct-declaration-list不包含任何命名成员(直接或通过匿名结构或匿名联合),则行为未定义。

    但是一些编译器(GCC和clang至少)允许这样做,作为扩展。

    如果这是结构中唯一的位域,则使用有点受限,但不是不可能使用,如ouah所示。

    标准继续另一个“古怪”:

    作为特殊情况,宽度为0的位域结构成员表示不再将其他位字段打包到放置了前一位域(如果有的话)的单元中。

    该程序调用未定义的行为。

    C说:

    (C99,6.7.2.1p7)“[…]如果struct-declaration-list不包含命名成员,则行为未定义。”

    现在有些编译器接受它作为扩展。 这怎么有用?

    例如对于Linux内核着名的BUILD_BUG_ON_ZERO宏:

     #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 

    要查看此宏的内容,您可以在这里查看 。

    那么,根据语言规范,如果您的程序包含没有命名成员的结构类型,则行为是未定义的。 (关于为什么它没有被正式承认为违反约束的问题,我没有立即回答。)见6.7.2.1/7

    struct-declaration-list是结构或联合成员的一系列声明。 如果struct-declaration-list不包含命名成员,则行为未定义。

    除此之外,这种声明并不真正“有用”,因为它产生的唯一的东西是未定义的行为。

        以上就是c/c++开发分享没有命名成员的struct在哪里有用?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(XD中文网)。

        本文链接:https://xdcnz.com/9754.html