Xcode, warnings et directives de compilation.
Paisible.fr
Membre
Encore une question sur Xcode-LLVM-GCC 4.2
J'ai dans mon fichier "xxx-Prefix.pch" le petit bout de code suivant pour me faciliter la vie :
Pour que ce soit plus facile à lire je l'ai placé sur plusieurs lignes avec des "\" pour indiquer la suite.
Manque de bol, cela génère un Warning : Backslash-newline at end of file
Est-ce qu'il existe une directive de compilation pour masquer ce warning ?
J'ai dans mon fichier "xxx-Prefix.pch" le petit bout de code suivant pour me faciliter la vie :
<br />#define UIColorFromRGB(rgbValue) [UIColor \<br />colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \<br />green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \<br />blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]<br />
Pour que ce soit plus facile à lire je l'ai placé sur plusieurs lignes avec des "\" pour indiquer la suite.
Manque de bol, cela génère un Warning : Backslash-newline at end of file
Est-ce qu'il existe une directive de compilation pour masquer ce warning ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Car si rgbValue est une variable de type "signed", le ">>" étant considéré comme un shift "arithmétique" et non juste un shift "logique", cela risque d'insérer des "1" lors du décalage si le bit de poids fort de rgbValue est déjà un "1".
En effet, si tu pars de 0xFFFFFFFE, représentation du nombre -2 pour un sint32 " entier signé sur 32 bits " le décaler de 1 vers la droite va donner 0xFFFFFFFF et non pas 0x7FFFFFFF, de sorte que le décalage de 1 vers la droite, correspondant en arithmétique à une division par 2, donne bien -1 et pas le nombre positif 2^31.
En effet le décalage arithmétique vers la droite va recopier le bit de poids fort lors du décalage, (contrairement au décalage logique).
Dans la plupart des cas, vu que je suppose que tu passes à rgbValue une valeur < 2^24 (qui tient sur 3 octets le 4e étant ignoré), cela ne change rien, mais bon, par mesure de précaution au cas où tu passes pour une raison X ou Y à rgbValue une valeur qui se trouve être typée sous forme "signed" et pas "unsigned" et qu'en plus son octet de poids fort soit à 1 (genre [tt]UIColorFromRGB((signed long)0xFFFFFFFF)[/tt] ça va foirer.
Je l'admet, c'est un cas bien rare pour ce qui te préoccupe ici, mais bon, c'est plutôt par habitude, on préfère faire le masquage à la fin, donc faire le décalage de 16 d'abord et masquer avec 0xFF après, que masquer avec 0xFF0000 d'abord et décaler après.
Bon je sais ça répond pas à ton problème de warning, mais bon
Je n'ai rien fait d'autre que de supprimer tes passages à la ligne puis je l'ai redécoupée et ensuite je n'avais plus les warnings (après un clean-build quand même). Il m'avait semblé bizarre d'avoir un warning se plaignant deux fois quand tu as trois coupures dans ta ligne ..
Ton define serait-il à la fin de ton fichier ?
Ca aurait un impact ?
"// FIN DE HEADER"
EDIT: Je rejoint Ali pour la remarque sur le masquage des données. Il est plus sûr de réaliser le masquage une fois le décalage effectué.