j'avais besoin de déclarer une union à l'intérieur d'une structure telle que définie ci-dessous:Référencer une union dans une structure à l'aide étiquette syndicale donne une adresse incorrecte
struct MyStruct
{
int m_DataType;
DWORD m_DataLen;
union theData
{
char m_Buff [_MAX_PATH];
struct MyData m_myData;
} m_Data;
};
Dans un premier temps, j'ai essayé d'accéder aux données syndicales comme suit (avant a ajouté la déclaration m_Data):
MyStruct m_myStruct;
char* pBuff = m_myStruct.theData::m_Buff;
Cette compile mais retourne à pBuff un pointeur au début de la structure MyStruct qui m'a fait remplacer les m_DataType & membres de m_DataLength quand je pensais que j'écrivais au tampon m_Buff. J'utilise Visual Studio 2008. Quelqu'un peut-il expliquer ce comportement inattendu? Merci.
Oui, c'est essentiellement ma question. Je ne comprends pas pourquoi cela a été compilé ou pourquoi il m'a donné le mauvais décalage. J'utilise maintenant m_myStruct.m_Data.m_Buff mais je voulais juste comprendre le raisonnement du compilateur pour la méthode d'accès précédente. – AlanKley
Etes-vous sûr qu'il était en train de compiler? Vraiment sûr? Pouvez-vous vérifier à nouveau, parce que je ne vois aucune interprétation légitime pour ce que vous avez écrit, et pointer du doigt le compilateur pensant 'bug'. –
et AlanKley: J'ai compilé l'exemple d'Alan avec plusieurs versions de MSVC++ et il compile sans erreur jusqu'à la version VC2010 d'aujourd'hui, et le résultat de l'expression est exactement comme décrit par Alan - aussi absurde que cela puisse paraître. Tous les autres compilateurs que j'ai essayés donnent un message d'erreur approprié. –