J'ai récemment trébuché à travers le comportement suivant du programme alternatif d'écriture gcc 3.2.2:Pourquoi un « nom de la fonction » évaluée à true C et comment être averti sur ce
Dans une instruction if j'ai oublié les accolades d'une fonction et a écrit:
if(myFunc)...
au lieu de if(myFunc())...
Cela ne génère pas une erreur ni un avertissement bien que j'ai à peu près tous les avertissement allumé. Il a simplement été évalué à true
. Pourquoi ce code légal écrit-il en premier lieu? Parce que la fonction existe/a une adresse? Est-ce que quelqu'un sait comment on pourrait éviter de telles erreurs ou s'il y a une option d'avertissement que j'ai oubliée? Ce problème est-il mieux résolu dans les versions ultérieures de gcc?
Voici l'appel exact du compilateur complet:
msp430-gcc -g -Os -mmcu=msp430x1611 -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wwrite-strings -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
-Wredundant-decls -Wnested-externs -Wimplicit-function-declaration -Werror
(Depuis que je suis obligé d'utiliser gcc 3.2.3 il n'y a pas -Wextra)
Tant que 'myFunc' est défini, true true et la branche toujours prise, on s'attendrait à ce qu'il y ait du code mort s'il y a une branche' else'. Cela pourrait déclencher un avertissement ... Aussi mon 'man gcc' dit *" -Wextra (Cette option était appelée -W. L'ancien nom est toujours supporté, mais le nouveau nom est plus descriptif.) "* – dmckee
Est' myFunc 'une fonction ou un pointeur de fonction? –
@Adam: myFunc() est une fonction ordinaire – Martin