Erf, valà valà, j'ai un problème, fallait bien que ça arrive un jour, hein ? Bon ben je me suis donc attaqué au développement 64 bits (sur Atom 330, pour ceux qui ont suivis) et j'essaye -"autant-que-faire-se-peut"- à ce que mon build soit aussi bien compatible 32 bits que 64 bits (erf, je sais, je rêve éveillé). Je cherche à gommer AU MAXIMUM les différences, et j'y suis presqu'arrivé, sauf que :
typedef struct{ // size, offset 32 bits, offset 64 bits
int nCount; // 4, 0, 0
short nMode; // 2, 4, 4 <- ???
sHue sColor; // 8, 8, 8
char* pTest; // 4, 16, 16
char aData[10]; // 10, 20, 24
}sStack,*psStack; // 28 (real) -> 32 (sizeof 32 bits), 40 (sizeof 64 bits)
Si on passe
aData à 12, même si la struct ne fait 'que' 30, l'offset faisant la taille réelle passe à 32 (en 32 bits). En passant à 13, le sizeof passe à 36 (alignement de 4, version 32 bits). Bref voilà pour présenter le problème en général...
En particulier, je voudrais une struct de TOUJOURS la même taille, version 32 ou 64 bits, puisque je fais du message-passing. Donc derrière un client 32 bits il peut y avoir un serveur 64 bits, et inversement. Comme je ne veux PAS à connaître l'architecture en face (cliet ou serveur) il faudrait donc pouvoir fixer la taille des pointeurs à 8 octets. J'ai donc essayé ça :
#pragma pack(8)
typedef struct{
[...]
}sStack,*psStack;
#pragma pack()
Mais heu, ça marche pô : sur architecture 32 bits le compilateur 'caste' toujours les pointeurs sur 32 bits et le
sizeof reste toujours à 32 :/ Non pas que je m'attende à ce qu'il passe à 40 (puisque
nMode est encore 'casté' sur 4 octets -???-) mais au moins un sizeof à 36.
L'idée c'est de continuer à pouvoir utiliser
((psStack)buff)->pTest indifférement sur un build 32 bits ou 64 bits, sans avoir à caster, et surtout de pouvoir faire transiter une
struct de toujours la même taille (le fameux
buff qui reçoit un buffer quelconque). Les appels
stdcall et
cdecl doivent quand à eux rester les mêmes suivant la plateforme, donc proscription d'utiliser le switch
/vmg par exemple. Je voudrais éviter le switch
/Zp8 puisque je ne veux pas que toutes les
struct soient affectées.
Bon je sais c'est pas forcément clair, mais si quelqu'un a une idée...
Kochise