Как я могу предотвратить безымянную структуру \ объединение? - PullRequest
5 голосов
/ 13 января 2012

Я создаю класс, у которого есть объединение для его матричных данных, однако, я могу его скомпилировать только тогда, когда у меня нет имени для struct \ union.Тем не менее, с более высоким уровнем предупреждения (четыре на визуальной студии) я получу предупреждение, говорящее

warning C4201: nonstandard extension used : nameless struct/union

Я посмотрел на него, и я, похоже, не смог найти способ предотвратить это.В любом случае, насколько я знаю, это приведет к другой ошибке компилятора, связанной с объявлением того или другого.Как я могу предотвратить получение этого предупреждения и привести его в соответствие со стандартами, не отключая предупреждение.

    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];
    };

(Да, я знаю, что есть доступные математические библиотеки. Пожалуйста, не превращайте это в "использование xxx"библиотека "обсуждение, я делаю это, чтобы расширить свои знания C ++".)

Ответы [ 4 ]

6 голосов
/ 13 января 2012

Наименование кажется лучшим.В 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];
};

Вы можете использовать ссылки / макросы, чтобы разрешить доступ без bar.

F32& _11 = bar._11;
F32& _12 = bar._12;

По сути то же самое, что и анонимная структура,Я не очень рекомендую это все же.Используйте 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];
  };
};
3 голосов
/ 13 января 2012

Если все, что вы хотите сделать, это отключить предупреждение, не изменяя фактический код, тогда вы можете использовать директиву #pragma warning следующим образом:

#pragma warning(disable : 4201)

Если вы хотите включить его снова, используйте:

#pragma warning(default : 4201)

Дополнительные сведения см. В документации MSDN .

.
0 голосов
/ 30 августа 2018
union
{
    struct // <- not named here
    {
        F32 _11, _12, _13, _14;
        F32 _21, _22, _23, _24;
        F32 _31, _32, _33, _34;
        F32 _41, _42, _43, _44;
    } AsStruct; // <- named here
    F32 AsArray[16];
};

Я исправил это без указания имени класса struct, только имени экземпляра.

0 голосов
/ 19 ноября 2014

У вас есть это предупреждение не о внутренней структуре, а о самом союзе. Попробуйте это:

union Mat    // <-------
{
    struct
    {
        F32 _11, _12, _13, _14;
        F32 _21, _22, _23, _24;
        F32 _31, _32, _33, _34;
        F32 _41, _42, _43, _44;
    };
    F32 _m[16];
};

Mat mat;
mat._11 = 42;
F32 x = mat._22;
mat._m[ 3 ] = mat._33;
...