Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I prevent a nameless struct\union?

I am building a class that has a union for its matrix data, however, I can only get it compile when I do not have a name for the struct\union. However, with a higher level warning level (four on visual studio) I will a warning saying

warning C4201: nonstandard extension used : nameless struct/union

I looked into it, and I don't seem to be able to find a way to prevent this. Anyway possible that I know of will cause a different compiler error related to the declaration of one or the other. How can I prevent getting this warning and make it conform to standards, without just disabling the warning.

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

(Yes, I know there is matric libraries available. Please do not turn this into a "use xxx library" discussion, I am doing this to expand my knowledge of C++".)

like image 658
mmurphy Avatar asked Jan 13 '12 04:01

mmurphy


3 Answers

Naming it seems best. Anonymous unions are allowed in C++, just not structs.

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

You can use references/macros to allow access without bar.

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

Essentially the same as an anonymous struct. I don't really recommend this though. Use bar._11 if possible.


Private/public (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];
  };
};
like image 79
Pubby Avatar answered Oct 19 '22 20:10

Pubby


If all you want to do is to disable the warning without changing the actual code then you can use #pragma warning directive like so:

#pragma warning(disable : 4201)

If you want to reenable it again use:

#pragma warning(default : 4201)

For addition reference, see MSDN documentation.

like image 33
codekiddy Avatar answered Oct 19 '22 21:10

codekiddy


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

I fixed it without giving the struct class a name, just the instance name.

like image 36
Dominic Birmingham Avatar answered Oct 19 '22 19:10

Dominic Birmingham