2016-12-03 2 views
1

J'ai un projet open source que je veux exécuter/compiler sur des architectures 32 bits et 64 bits. Mais voici le problème: il utilise beaucoup les tableaux dynamiques, et il doit aussi jouer avec leur longueur. Les tableaux dynamiques ont une longueur stockée dans le type size_t, qui est ulong sur 64 bits, et uint sur les systèmes 32 bits.
J'ai du code qui ressemble à ceci:Conception de programmes à compiler sur 32 bits et 64 bits dans D

int i = 0;//this HAS to be int, not uint for some reasons 
i = dynArray.length;//error, can't implicitly cast ulong to uint 

Je dois i à int (sur 32 bits) et sur long (64bit). size_t aurait résolu le problème, mais il est unsigned (soit uint ou ulong).

Donc ma question ici est que: comment puis-je créer un type de données entier qui est int sur 32 bits et long sur 64 bits? Sera-ce quelque chose comme ça ?:

32bit{ 
    //Declaration for 32 bit version 
}else{ 
    //Declaration for 64 bit version 
} 
+4

Vous voulez ptrdiff_t. Comme size_t vient de signer. –

+0

Pourquoi ne pas lancer explicitement alors, si ça va toujours? –

+0

@SamiKuhmonen c'est parce que l'utilisation d'uint sur 64 bits est un non-sens, je veux être en mesure de tirer parti de la compilation pour 64 bits. – Nafees

Répondre

1

Comme indiqué dans les commentaires, il y a déjà un type entier de pointeur largeur signé. Il est appelé ptrdiff_t dans D (et C et C++). Ne définissez pas le vôtre.

1

Essayez ceci:

version (X86) 
{ 
    // Declaration for 32 bit version 
    alias myint = int; 
} 
else 
{ 
    // Declaration for 64 bit version 
    alias myint = long; 
}