2011-05-24 4 views
2

en C++, nous pouvons le faire:C# directives préprocesseur

struct { 
#if defined (BIGENDIAN) 
     uint32_t h; 
     uint32_t l; 
#else 
     uint32_t l; 
     uint32_t h; 
#endif 
    } dw; 

Maintenant, en C# pas si simple. J'ai une méthode pour tester BigEndian mais pour définir la structure au moment de la compilation, comment pouvons-nous obtenir le même effet en C#? Je pensais que je peux avoir des classes comme "BoardBig" et "BoardLittle" et utiliser une usine pour obtenir la classe dont j'ai besoin basé sur le contrôle IsBigEndian. Et pour les contrôles _WIN64, je peux avoir des classes comme "Position_64" et "Position_32" quelque chose comme ça. Est-ce une bonne approche? Depuis C# ne peut pas définir des déclarations comme #define IsBigEndian 1 ou ce que vous avez, ne savez pas quoi faire.

Répondre

4

Mise à jour: Et comme d'autres affiches ont souligné (upvoted), ce n'est pas une solution pour l'endianness en C#.

C# Conditional compilation directives

#if BIGENDIAN 
     uint32_t h;  
     uint32_t l; 
    #else 
     uint32_t l; 
     uint32_t h;   
    #endif 

BTW, vous devriez éviter ces si vous le pouvez. Rend le code plus difficile à tester.

+0

Vous avez lié à la documentation de JScript. Voici la version C#: http://msdn.microsoft.com/en-us/library/aa691095.aspx – porges

+0

D'oh! Thx! ........ Fixé. –

2

Il existe une compilation conditionnelle en C#, mais vous ne pouvez pas l'utiliser pour obtenir un code différent en fonction de l'endianess. Pour les langages gérés, l'endianess du système n'est pas connu au moment de la compilation.

Le compilateur produit du code IL, qui peut être exécuté sur les systèmes big endian et little little endian. C'est le compilateur JIT qui prend soin de transformer le code IL en code machine natif, et de convertir les littéraux numériques dans le format correct.

Vous pouvez utiliser BitConverter.IsLittleEndian pour connaître l'endianess lors de l'exécution.

+0

a ajouté un lien vers BitConverter.IsLittleEndian –

2

Puisque vous ne pouvez pas "mapper" les structures C# en données brutes, il n'y a aucun avantage réel à utiliser le préprocesseur dans ce but. Donc, alors que C# a des fonctionnalités de préprocesseur qui peuvent être utilisées à d'autres fins, je ne pense pas qu'elles seront précieuses pour vous ici. Au lieu de cela, il suffit de travailler avec une structure préférée et d'enterrer le twittling de bas niveau pour les cas spéciaux. Voici un exemple de manipulation big-endian et little-endian pour une structure:

+0

Cela semble assez intéressant à lire. Je vais regarder. Merci beaucoup – David

Questions connexes