Problème de compilation: opérateur +=

Le
Patrick 'Zener' Brunet
Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code suivant:

typedef unsigned __int16 U16; /* Selon types génériques disponibles */

U16 umTest1, umTest2;

umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?

Qu'en pensez-vous ? Merci.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Artus RAFI-TURENNE
Le #306730
"Patrick 'Zener' Brunet" le message de news:f1k4sf$nnb$
Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:


typedef unsigned __int16 U16; /* Selon types génériques disponibles
*/

...
U16 umTest1, umTest2;
...
umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?



Mais est-ce une double coquille ce : UmTest2, à la place de umTest2 ?

Patrick 'Zener' Brunet
Le #306729
Bonjour.

"Artus RAFI-TURENNE" f1k65h$emc$

"Patrick 'Zener' Brunet" dans

le message de news:f1k4sf$nnb$
Bonjour.

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme
tout


provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:


typedef unsigned __int16 U16; /* Selon types génériques
disponibles


*/
...
U16 umTest1, umTest2;
...
umTest1 += UmTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible


loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?



Mais est-ce une double coquille ce : UmTest2, à la place de umTest2 ?



Oui, navré :-( les effets de la sélection automatique dans le mailer :-@

Le code compile à ce warning près, sinon il y aurait un identifiant inconnu.

il faut lire:

umTest1 += umTest2;

remplacé par:

umTest1 = (U16) (umTest1 + umTest2);

Merci.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/


Serge Paccalin
Le #306728
Le dimanche 6 mai 2007 à 10:56:18, Patrick 'Zener' Brunet a écrit dans
fr.comp.lang.c++ :

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.


Ça part d'un bon sentiment.

Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code suivant:
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16, possible
loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + UmTest2);


Autre solution : désactiver ce warning-là dans ces cas-là :

#pragma warning (disable: 4244) // "+-" ..., possible loss of data

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).

Patrick 'Zener' Brunet
Le #306727
Bonjour.

"Serge Paccalin" news:
Le dimanche 6 mai 2007 à 10:56:18, Patrick 'Zener' Brunet a écrit dans
fr.comp.lang.c++ :

J'ai décidé d'épurer de toute faute une de mes librairies C++, comme
tout provider est supposé le faire.


Ça part d'un bon sentiment.



J'imagine celui du user qui veut compiler son code en W4 et qui prend des
warnings dans une librairie de templates.

Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + umTest2);


Autre solution : désactiver ce warning-là dans ces cas-là :

#pragma warning (disable: 4244) // "+-" ..., possible loss of data



J'ai même une technique portable pour désactiver / réactiver un warning de
part et d'autre d'une section.

Je fais ça pour certains idiomes que j'utilise souvent de manière sûre:

4706, pour ecrire par exemple:
if( bCheck = (x == y))

4355, pour passer des références de parents à des child nodes

4060/4065, pour autoriser des switch() vides...

Mais par contre pour le 4244, faire ça à chaque utilisation est encore plus
lourdingue que la forme ci-dessus, et le désactiver globalement désarme une
alerte vraiment utile.

C'est d'autant plus bête que le débordement de mantisse n'est pas pris en
compte, seulement la perte de signe. Ce que je comprendrais pour
l'opérateur -= mais avec le += c'est pas fin du tout.

Merci.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/


Patrick 'Zener' Brunet
Le #306725
Bonjour.

"Patrick 'Zener' Brunet" le message news: f1k4sf$nnb$
J'ai décidé d'épurer de toute faute une de mes librairies C++, comme tout
provider est supposé le faire.
Donc j'ai spécifié le niveau de warning 4. Tout passe, sauf le code
suivant:

typedef unsigned __int16 U16; /* Selon types génériques dispos */
...
U16 umTest1, umTest2;
...
umTest1 += umTest2;

==> Warning C4244: "+-" conversion from int to unsigned __int16,
possible loss of data
(c'est le compilo MS).

La seule forme qu'il accepte est la suivante (plus lourdingue tu meurs):

umTest1 = (U16) (umTest1 + umTest2);

Je ne crois pas que le sens de la norme soit de décourager l'usage des
opérateurs compacts, ni de forcer l'usage systématique du type le moins
spécialisé, alors j'imagine que c'est une "feature" de mon compilateur ?

Qu'en pensez-vous ? Merci.



Donc finalement après de longues recherches, j'ai dû retomber au niveau de
warning 3 + option "treat warnings as errors" et là ça passe sans problème.

En principe les deux formes ci-dessus sont strictement équivalentes, la
première étant calculée exactement comme la seconde.

Ben visiblement c'est pas au point sur ce compilo :-(
D'ailleurs en cherchant sur Google "warning 4244 bogus" on trouve énormément
de projets où il est désactivé avec cette explication sommaire... Ce qui
n'est pas forcément 100% crédible bien sûr.

Je préfère ne pas désactiver globalement ce warning parce que cela
supprimerait sans discrimination toute sécurité sur les conversions.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/

Publicité
Poster une réponse
Anonyme