如何防止无名的struct\union?

mmu*_*phy 5 c++ standards struct unions

我正在构建一个具有矩阵数据联合的类,但是,当我没有struct\union的名称时,我只能编译它.但是,如果有更高级别的警告级别(视觉工作室有四个),我会发出警告说

warning C4201: nonstandard extension used : nameless struct/union
Run Code Online (Sandbox Code Playgroud)

我调查了一下,我似乎无法找到防止这种情况的方法.无论如何,我所知道的可能会导致与一个或另一个的声明相关的不同编译器错误.如何在不禁用警告的情况下阻止获取此警告并使其符合标准.

    union
    {
        struct
        {
            F32 _11, _12, _13, _14;
            F32 _21, _22, _23, _24;
            F32 _31, _32, _33, _34;
            F32 _41, _42, _43, _44;
        };
        F32 _m[16];
    };
Run Code Online (Sandbox Code Playgroud)

(是的,我知道有可用的matric库.请不要把它变成"使用xxx库"讨论,我这样做是为了扩展我对C++的了解".)

Pub*_*bby 6

命名似乎最好.C++允许使用匿名联合,而不是结构.

union
{
    struct foo
    {
        F32 _11, _12, _13, _14;
        F32 _21, _22, _23, _24;
        F32 _31, _32, _33, _34;
        F32 _41, _42, _43, _44;
    } bar;
    F32 _m[16];
};
Run Code Online (Sandbox Code Playgroud)

您可以使用引用/宏来允许访问bar.

F32& _11 = bar._11;
F32& _12 = bar._12;
Run Code Online (Sandbox Code Playgroud)

基本上与匿名结构相同.我不是真的推荐这个.bar._11尽可能使用.


私人/公共(sorta):

struct mat 
{
  struct foo 
  {
    friend class mat;
    private:
      F32 _11, _12, _13, _14;
      F32 _21, _22, _23, _24;
      F32 _31, _32, _33, _34;
      F32 _41, _42, _43, _44;
  };
  union
  {
    foo bar;
    F32 _m[16];
  };
};
Run Code Online (Sandbox Code Playgroud)


cod*_*ddy 6

如果您只想禁用警告而不更改实际代码,那么您可以使用#pragma warning如下指令:

#pragma warning(disable : 4201)
Run Code Online (Sandbox Code Playgroud)

如果您想再次重新启用它,请使用:

#pragma warning(default : 4201)
Run Code Online (Sandbox Code Playgroud)

有关其他参考,请参阅 MSDN文档