2010-04-14 3 views
2

J'ai une fonction déclarée comme:Pourquoi gcc4 prévenir et comment l'éviter

void event_add_card (EventAddr addr, EventType type, unsigned char card); 

et de l'union

typedef union EventData 
{ 
    float   money;  /**< money info */ 
    unsigned char card;  /**< new card */ 
} 
EventData; 

Quand je compile le code suivant:

EventData data = {}; 

event_add_card (0,0, data.card); 

avec avertissement activé -Wconversion Je reçois l'avertissement suivant:

player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype 

Pourquoi gcc4 échoué et comment y remédier ??

+0

bcause du syndicat. Êtes-vous sûr de ne pas vouloir le définir en tant que struct? – eaanon01

Répondre

3

Dans les versions de gcc antérieures à 4.3, -Wconversion génère un avertissement lorsque le comportement peut être différent selon que le prototype est dans la portée ou non. Dans l'exemple que vous donnez, l'argument 3 (data.card) est de unsigned char; Si le prototype pour event_add_card() est dans la portée, il sera passé comme unsigned char, mais si le prototype n'est pas dans la portée, il sera passé comme int en raison des règles de promotion des nombres entiers de C - d'où l'avertissement.

Ceci n'est pas très utile, sauf pendant le processus de conversion de l'ancien code K & pour utiliser des prototypes. En tant que tel, si vous utilisez une ancienne version de gcc, ce n'est pas une option généralement utile à activer. Depuis gcc 4.3, le comportement a changé: il avertit désormais de toute conversion implicite susceptible de modifier une valeur (disons, entre des entiers signés et non signés, ou des entiers et des flottants). Ceci est considérablement plus utile. (La fonctionnalité précédente n'a pas disparu, cependant: il est toujours disponible, mais rebaptisé -Wtraditional-conversion.)

(Plus de détails à http://gcc.gnu.org/wiki/NewWconversion.)

+0

* MERCI *, c'est une bonne note –

1

Le problème est que vous utilisez -Wconversion

Il n'y a rien de mal avec votre code, et rien que vous pouvez faire pour -Wconversion produisent pas cet avertissement.

Exemple:

void someFunction(unsigned char foo); 
... 
unsigned char bar = 'f'; 
someFunction(bar); 

Cela produira la même erreur si vous compilez et utilisez -Wconversion

-Wconversion vise à identifier les problèmes lors de la conversion entre K & R et ISO C, qui vous aren ne fais pas.

Questions connexes