2010-06-29 24 views
2

Aux fins de la vérification du type je voudrais définir une fonction sur les lignes deExiste-t-il un bon moyen de forcer l'incompatibilité de type en C?

void myfunc(type1 a, type2 b) 
{ 
... 
} 

type1 et type2 sont tous deux typedefed à uint8_t. Jusqu'ici tout va bien, mais pour des raisons de santé et de vérification (pensez à DbC), je voudrais éviter que la fonction soit appelée avec une valeur type2 pour le premier paramètre ou une type1 pour la seconde. Malheureusement, le typecasting implicite de C est contre moi ici. Est-ce que quelqu'un connaît un moyen?

+0

Ce n'est pas la typecasting implicite de C contre vous. Vous auriez le même problème en C++. Par définition, l'utilisation d'un typedef est identique à l'utilisation du type typedef. – Amnon

+1

Vous pouvez également jeter un coup d'oeil sur: http://stackoverflow.com/questions/376452/enforce-strong-type-checking-in-c-type-strictness-for-typedefs – quinmars

+0

Également en cours de discussion ici http: // stackoverflow .com/questions/18108046/prevent-automatic-cast-with-integers (pour C++ mais ils vont partager quelques idées) – doctorlove

Répondre

6

Vous pourriez envelopper les deux types dans un Struct.

typedef struct { 
    uint8_t data; 
} type1; 

typedef struct { 
    uint8_t data; 
} type2; 

Edit: Je n'ai pas l'aimer parce que vous maintenant d'utiliser a.data au lieu d'un

+0

pourquoi dites-vous que ce n'est pas agréable? L'intention est claire: les types sont différents. –

+0

Oui, c'est vrai. Malgré le nom, 'typedef' n'introduit pas un nouveau type en C - seulement' struct' et 'union' le font. – caf

+0

Je suis d'accord que d'avoir à utiliser un.data est un peu gênant, sinon que cela me semble tout à fait propre. Merci! – michaeljt

0

Je pense que vous pouvez envelopper vos types en utilisant struct et ensuite passer le pointeur à ces struct.

+1

Vous pouvez même passer les structs lui-même au lieu de pointeurs. Les structs ne doivent pas être passés par ref, ils peuvent être passés en valeur (dans ce cas, tout le contenu de la structure est copié, donc pas une bonne idée pour les grosses structs). Les passer en valeur n'a pas de surcharge, si la structure elle-même n'est pas plus grande qu'une référence de pointeur serait en taille. – Mecki