2011-09-05 4 views
2

J'aimerais pouvoir utiliser le préprocesseur, mais l'entrée vient à l'exécution. J'ai essayé un typedef conditionnel, ça ne marche pas. Ou déclaration conditionnelle, ne fonctionne pas. Bien que je ne m'attendais pas vraiment à eux non plus. Et puisque tout le code qui suit est exactement le même, je ne veux pas avoir à le réécrire deux fois ... une fois pour chaque struct.Compatibilité entre 2 structs

Existe-t-il un moyen de faire cela en C? Ou approche différente, avec le même résultat. Toutes mes recherches google m'ont amené à des modèles C++. Si je ne suis pas clair, cela aidera peut-être:

#include <stdio.h> 

struct a32 { 
    short bits; 
    unsigned long val; 
    // more values, not necessarily in the same order 
}; 

struct a64 { 
    short bits; 
    unsigned long long val; 
    // etc... 
}; 

int main(void) { 
    struct a32 mystruct; 

    // read mystruct from somewhere 

    if(mystruct.bits == 64) { 
     // then I need mystruct to be a64 
     // re-read mystruct 
    } 

    // exact same code for both structs 

    printf("%d\n", sizeof(mystruct.val)); 
    return 0; 
} 

Toute aide serait appréciée.

Répondre

3

Pourquoi ne pas faire quelque chose comme cela, en supposant que le rembourrage ne sera pas un problème:

struct { 
    unsigned long val; 
} a32; 

struct { 
    unsigned long long val; 
} a64; 

int main(void) { 
    short bits; 
    union { 
     struct a32 struct32; 
     struct a64 struct64; 
    }; 

    // Read bits 

    if (bits == 64) { 
     // Read into struct64 
    } else { 
     // Read into struct32 
    } 

    return 0; 
} 

Ce sera, bien sûr, vous avez besoin d'être au courant de la valeur de bits pour que vous sachiez quelle variable struct accéder.

2

Vous pouvez « sorta » faire en utilisant les syndicats:

struct{ 
    short bits; 
    union{ 
     unsigned long a32; 
     unsigned long long a64; 
    }; 
} a_int; 

int main(void) { 
    a_int mystruct; 

    // read mystruct from somewhere 

    if(mystruct.bits == 64) { 
     // then I need mystruct to be a64 
     // re-read mystruct 
    } 

    // exact same code for both structs 

    printf("%d\n", sizeof(mystruct.a32)); 
    return 0; 
} 

EDIT: Cependant, il est impossible de faire le travail pour les deux printf() les entiers de 32 bits et 64 bits.

+0

Cela aurait aussi été ma solution :) Je pense qu'il ne devrait pas y avoir de problème avec le rembourrage parce que l'union sera au moins aussi grande que le plus grand type déclaré dans ce droit? – Dan

+0

Merci, je pense que ça va faire l'affaire. – olly

+2

La lecture de la structure complète est une mauvaise idée. Vous devez d'abord lire les "bits", puis "basculer" sur la valeur pour remplir le reste des données. – James

1

Pas 100% sûr que c'est ce que vous voulez dire. Si non, veuillez clarifier la question.

Vous devez utiliser une union étiquetée. Créez une structure avec une balise (par exemple, un int) et une union. L'union est entre les structs possibles que cela pourrait être, et l'étiquette identifie lequel en particulier il est.

Google "tagged union" pour plus de détails.

Questions connexes