2012-01-13 117 views
5

我正在構建一個具有矩陣數據聯合的類,但是,只有當我沒有struct \ union的名稱時,才能進行編譯。然而,具有較高水平的警告級別(四國視覺工作室),我會警告說如何防止無名的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++」的知識。)

+0

爲了未來的讀者的利益,你可以顯示你的代碼,該結構的名稱和不編譯? – 2012-01-13 05:35:57

回答

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

您可以使用引用/宏允許訪問,而不bar

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

本質上與匿名結構相同。但我並不真的推薦這個。如果可能,請使用bar._11


私人/公共(八九不離十):

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

似乎這樣做。雖然不是原始問題的一部分,但是有沒有辦法讓酒吧保護私人空間,同時仍然允許_m公開? – mmurphy 2012-01-13 05:09:12

+1

@mmurphy查看我的更新。這有點可能。 – Pubby 2012-01-13 05:16:29

+0

哦,好的,有趣。最後一件事,我使用引用進行了研究(如果可能的話,我希望使用_11,而不用前綴)。如何在課堂上聲明參考?諸如「F32&_11 = bar._11」之類的東西不能僅僅在公共場合:。 – mmurphy 2012-01-13 05:57:31

3

如果你想要做的是禁用警告不改變實際的代碼,那麼你可以使用#pragma warning指令,像這樣:

#pragma warning(disable : 4201) 

如果要再次重新使用,請使用:

#pragma warning(default : 4201) 

有關其他參考,請參閱MSDN documentation

+0

對不起,我應該更具體,並說沒有禁用警告 – mmurphy 2012-01-13 04:59:10

-1

你有這個警告不是關於內部結構,而是關於工會本身。試試這個:

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;