Xcode, warnings et directives de compilation.

Paisible.frPaisible.fr Membre
02:19 modifié dans Xcode et Developer Tools #1
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 :

<br />#define UIColorFromRGB(rgbValue) [UIColor &#092;<br />colorWithRed:((float)((rgbValue &amp; 0xFF0000) &gt;&gt; 16))/255.0 &#092;<br />green:((float)((rgbValue &amp; 0xFF00) &gt;&gt; 8))/255.0 &#092;<br />blue:((float)(rgbValue &amp; 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 ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    mai 2011 modifié #2
    Juste pour la petite histoire, je ferais le "shift" avant le "masquage" de ta rgbValue.

    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 :D
  • laudemalaudema Membre
    02:19 modifié #3
    Peux tu essayer de virer ta ligne et de la remplacer avec celle ci
    <br /><br />#define UIColorFromRGB(rgbValue) [UIColor &#092;<br />scolorWithRed:((float)((rgbValue &amp; 0xFF0000) &gt;&gt; 16))/255.0 &#092;<br />green:((float)((rgbValue &amp; 0xFF00) &gt;&gt; 8))/255.0 &#092;<br />blue:((float)(rgbValue &amp; 0xFF))/255.0 alpha:1.0]<br /><br />
    

    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 ..
  • LexxisLexxis Membre
    02:19 modifié #4
    Salut,
    Ton define serait-il à  la fin de ton fichier ?
  • Paisible.frPaisible.fr Membre
    02:19 modifié #5
    Oui il est a la fin de mon fichier.
    Ca aurait un impact ?
  • LexxisLexxis Membre
    mai 2011 modifié #6
    Essai de rajouter 1 ou 2 retour charriot apres la dernière ligne et/ou un commentaire style:
    "// 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é.
Connectez-vous ou Inscrivez-vous pour répondre.