2009-03-23 6 views
0

C++ De http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute(VS.71).aspx:Pourquoi cet échantillon de StructLayout .NET pour

[C++] 

[StructLayout(LayoutKind::Explicit, Size=16, CharSet=CharSet::Ansi)] 
__value class MySystemTime { 
public: 
    [FieldOffset(0)] short int wYear; 
    [FieldOffset(2)] short int wMonth; 
    [FieldOffset(4)] short int wDayOfWeek; 
    [FieldOffset(6)] short int wDay; 
    [FieldOffset(8)] short int wHour; 
    [FieldOffset(10)] short int wMinute; 
    [FieldOffset(12)] short int wSecond; 
    [FieldOffset(14)] short int wMilliseconds; 
}; 

que j'imagine cela, ou sont les éléments entre crochets ne concordent pas avec la syntaxe C++? Pourquoi ne pas faire tout cela quand C++ fournit les outils adéquats pour spécifier la structure dans la définition standard de la langue (et peut-être avec le #pragma pack()) généralement supporté. La compatibilité prévue dans la langue ne garantit-elle pas que vous pouvez définir en C++ toute structure que vous pouvez définir en C? Je comprends la nécessité d'être en mesure de décrire explicitement la mise en page d'une struct C dans d'autres langues, mais il semble que ce ne serait pas nécessaire avec C++ qui fournit

extern "C" { } 

Répondre

1

Les choses entre crochets sont appelés attributs, et apparaissent souvent dans le code C#. Ils apparaissent ici pour avoir la même signification, car ce n'est pas strictement C++. Il a des extensions Microsoft pour permettre l'intégration avec la CLI. Lorsque vous déclarez une telle structure en C ou C++, cela ne garantit pas une disposition de mémoire particulière. Pour contrôler cela, vous avez besoin de pragmas spéciaux pour contrôler "l'emballage". Ceux-ci sont spécifiques à la plateforme. Donc ce que vous voyez ici est juste l'équivalent CLR de cela.

Mise à jour: cet exemple provient de la documentation d'une ancienne version de l'intégration CLI de Microsoft pour C++, qui s'appelait Managed C++. Il a été abandonné très rapidement et remplacé dans la prochaine version par C++/CLI - une greffe de fonctionnalités CLI en C++ qui est si complète et large, il devient effectivement un langage différent tout comme C++ est une langue différente de C.

Questions connexes