2013-06-17 2 views
2

J'ai une question sur le code suivant:comment l'avertissement PC-Lint suivant est-il nettoyé dans C?

#define NUM_DAYS 60 
#define NUM_PEOPLE 30 

int days[NUM_DAYS]; 
int people[NUM_PEOPLE]; 

int size; 

size = sizeof(day) > sizeof(people) ? sizeof(day) : sizeof(people); 

alors que les macros NUM_PEOPLE peut être modifiée pour plus grand que NUM_DAYS ou moins NUM_DAYS, je suis l'avertissement: Warning 506: Constant value Boolean, comment y remédier? ou existe-t-il d'autres façons de le contourner sauf changement constant à variable?

+2

Quel compilateur utilisez-vous? Vous pouvez soit désactiver les paramètres d'avertissement de votre compilateur, soit utiliser un pragma pour les désactiver temporairement autour de ce code. –

+8

'days' s'écrit différemment dans' sizeof (day) ' – ouah

+2

cela ne devrait-il pas être sizeof (days)? – uselpa

Répondre

4

Votre vérificateur vous informe que sizeof(day) et sizeof(people) sont connus au moment de la compilation, et donc le conditionnel prendra toujours une branche, et jamais l'autre. En alternative à la suppression de l'avertissement sur votre outil, vous pouvez modifier votre code pour utiliser une directive de préprocesseur conditionnel afin de rendre la branche prise explicite.

#if (NUM_DAYS > NUM_PEOPLE) 
#define SIZE sizeof(day) 
#else 
#define SIZE sizeof(people) 
#endif 

size = SIZE; 
6

C'est un avertissement sans danger par PC-Lint.

Une expression sizeof est une constante entière (bien, sauf lorsque son opérande est un tableau de longueur variable, ce qui est votre cas) et le PC-Lint simplement vous informe que:

sizeof(day) > sizeof(people) 

est une constante booléenne (valeur 1 ici) dans votre programme.

Vous pouvez vous débarrasser de l'avertissement en ajoutant le commentaire suivant juste après l'expression relationnelle:

size = sizeof(day) > sizeof(people) /*lint -save -e506 */ ? sizeof(day) 
     : sizeof(people); 

Assurez-vous d'inclure le commentaire juste après l'expression > sinon l'avertissement ne disparaîtra pas.

Questions connexes