ordre d'initialisation des membres et warnings visual studio

ordre d'initialisation des membres et warnings visual studio - C++ - Programmation

Marsh Posté le 03-10-2006 à 17:29:12    

L'ordre de declaration des membres d'une classe va avoir de l'importance si l'on veut les initialiser dans une liste lors de l'appel du constructeur:
 

Code :
  1. class T
  2. {
  3. int b, a;
  4. T(int a, int b) : a(a), b(b) {}
  5. };


 
Ce code va générer un warning lors de la compilation avec gcc parce que b est declaré avant a en tant que membre, mais il est initialisé apres dans le constructeur.
 
Je souhaiterais que cl, le compilateur de visual studio, me lance le meme warning, ce qu'il ne fait pas par defaut.
 
Quelqu'un saurait-il a quel code (C4XXX) ce warning correspond, ou ce qu'il faut faire pour l'obtenir?
 
Merci.

Reply

Marsh Posté le 03-10-2006 à 17:29:12   

Reply

Marsh Posté le 05-10-2006 à 15:27:14    

eh ben? personne?

Reply

Marsh Posté le 05-10-2006 à 15:54:49    

question sans doute très con, mais pourquoi GCC gueule pour ça [:petrus dei]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-10-2006 à 16:03:13    

Quel est l'interêt d'avoir un tel warning ?


Message édité par _darkalt3_ le 05-10-2006 à 16:03:31

---------------
Töp of the plöp
Reply

Marsh Posté le 05-10-2006 à 19:32:30    

visual c++, au moins 2003 (7.1) le fait, et par défaut il me semble.
vc6 ne fait pas de warning pour ça

Reply

Marsh Posté le 05-10-2006 à 19:33:46    

Harkonnen a écrit :

question sans doute très con, mais pourquoi GCC gueule pour ça [:petrus dei]


par ce l'ordre d'execution est forcément celle de déclaration des membres (ici : b puis a)
or ça ne correspond pas à ce qui est écris, donc le comportement réel risque d'être différent de ce à quoi s'attend le programmeur => warning

Reply

Marsh Posté le 05-10-2006 à 19:46:12    

Code :
  1. #include <iostream>
  2. struct A { A() { std::cout << 'O'; } };
  3. struct B { B() { std::cout << 'K'; } };
  4. struct C
  5. {
  6.     C() : a(), b() {}
  7.     B b;
  8.     A a;
  9. };
  10. int main()
  11. {
  12.     C c;
  13. }


 
KO

Reply

Marsh Posté le 06-10-2006 à 10:35:33    

jesus_christ a écrit :

visual c++, au moins 2003 (7.1) le fait, et par défaut il me semble.
vc6 ne fait pas de warning pour ça


 
 
Mmmh, je bosse sur Visual 2005, et y a pas de warning, c'est d'ailleurs tout le probleme...
On a des machines windows et linux qui compilent le meme projet. Les machines linux utilisent bien evidemment gcc et les machines windows utilisent cl.exe. Or on a defini gcc sous linux pour qu'il considere les warnings comme des erreurs afin d'avoir un code le plus propre possible etant donnée la taille du projet.
Sauf que cl n'émets pas les memes warnings que gcc... et donc des developpeurs sous windows vont envoyer un code qui pourrait ne pas compiler sous linux et c'est un vrai probleme.
 
Le warning que je cherche ici en est un parmi d'autres. Il s'avere que ces derniers temps il a ete plus problematique que d'autre d'ou ma question.
 
Merci de vos reponses en tous cas.

Reply

Marsh Posté le 06-10-2006 à 19:36:21    

il me semble avoir vu ce warning sous visual 2003, comme j'utilise aussi gcc, j'ai peut-être confondu, désolé :D

Reply

Marsh Posté le 06-10-2006 à 19:39:28    

taoa a écrit :

Mmmh, je bosse sur Visual 2005, et y a pas de warning, c'est d'ailleurs tout le probleme...
On a des machines windows et linux qui compilent le meme projet. Les machines linux utilisent bien evidemment gcc et les machines windows utilisent cl.exe. Or on a defini gcc sous linux pour qu'il considere les warnings comme des erreurs afin d'avoir un code le plus propre possible etant donnée la taille du projet.
Sauf que cl n'émets pas les memes warnings que gcc... et donc des developpeurs sous windows vont envoyer un code qui pourrait ne pas compiler sous linux et c'est un vrai probleme.
 
Le warning que je cherche ici en est un parmi d'autres. Il s'avere que ces derniers temps il a ete plus problematique que d'autre d'ou ma question.
 
Merci de vos reponses en tous cas.


 
C'est pas la solution à la question posée, mais utiliser gcc avec cygwin ca irait pas ?

Message cité 1 fois
Message édité par 0x90 le 06-10-2006 à 19:39:44
Reply

Marsh Posté le 06-10-2006 à 19:39:28   

Reply

Marsh Posté le 06-10-2006 à 22:26:07    

taoa a écrit :

On a des machines windows et linux qui compilent le meme projet. Les machines linux utilisent bien evidemment gcc et les machines windows utilisent cl.exe. Or on a defini gcc sous linux pour qu'il considere les warnings comme des erreurs afin d'avoir un code le plus propre possible etant donnée la taille du projet.
Sauf que cl n'émets pas les memes warnings que gcc... et donc des developpeurs sous windows vont envoyer un code qui pourrait ne pas compiler sous linux et c'est un vrai probleme.


Quelle est votre procédure avant de faire un commit ? Si vous utilisez deux compilateurs pour développer, il faut s'assurer que le code à comiter compile sans erreurs avec les deux compilateurs. Ce qui implique (grosso modo): les développeurs ont accès aux deux compilateurs, et ne comitent que si tout se passe bien avec les 2 compilateurs. Ou alors, il y a un gus à qui l' on envoi les patch, et qui se charge d'intégrer les modifications.
 

Citation :

Le warning que je cherche ici en est un parmi d'autres. Il s'avere que ces derniers temps il a ete plus problematique que d'autre d'ou ma question.


Ce warning est bien un cas particulier, tu peux aussi avoir un bug sur l'un des compilateurs, etc.
J'ai l'impression que c'est la procédure de commit qui est mal définie, et qui est l'origine du problème -- je pré-suppose qu'il y avait bien un intérêt majeur à utiliser deux compilateurs différents.
 

Reply

Marsh Posté le 07-10-2006 à 22:14:39    

0x90 a écrit :

C'est pas la solution à la question posée, mais utiliser gcc avec cygwin ca irait pas ?


 
hé non pasque pas moyen de débugguer sous visual studio si c'est compilé avec gcc ;)


Message édité par taoa le 07-10-2006 à 22:15:22
Reply

Marsh Posté le 07-10-2006 à 22:19:33    

++fab a écrit :

Quelle est votre procédure avant de faire un commit ? Si vous utilisez deux compilateurs pour développer, il faut s'assurer que le code à comiter compile sans erreurs avec les deux compilateurs. Ce qui implique (grosso modo): les développeurs ont accès aux deux compilateurs, et ne comitent que si tout se passe bien avec les 2 compilateurs. Ou alors, il y a un gus à qui l' on envoi les patch, et qui se charge d'intégrer les modifications.
 


 
c'est bien la tout le probleme... les gars sous linux ont gcc et les gars sous win ont cl. et c'est tout.
donc quand un gars sous linux commit du code qui fait planter windows, c'est le chantier et reciproquement. on doit avoir un jour ou l'autre une mahcine qui compile tout le projet a longueur de temps pour toutes les plateformes mais c'est pas encore ca.
 

Reply

Marsh Posté le 08-10-2006 à 09:48:31    

Le -Wall de gcc qui permet d'afficher le warning ne fonctionne pas avec vc++?

Reply

Marsh Posté le 08-10-2006 à 11:36:58    

Le -Wall de gcc fonctionne avec VS.
 
Seulement cette option rajoute tout un tas de warnings qui ne nous interessent pas, on veut juste ce warning la :/

Reply

Marsh Posté le 08-10-2006 à 12:31:25    

taoa a écrit :

Le -Wall de gcc fonctionne avec VS.
 
Seulement cette option rajoute tout un tas de warnings qui ne nous interessent pas, on veut juste ce warning la :/


 
-Wreorder alors

Reply

Marsh Posté le 09-10-2006 à 13:45:13    

GrosBocdel a écrit :

-Wreorder alors


 
 :??:  :??:  :??:  
connais pas ca :P

Reply

Marsh Posté le 09-10-2006 à 18:27:49    

Je l'ai pris de la doc de gcc. Ca n'existe pas chez bilou?

Reply

Marsh Posté le 10-10-2006 à 11:56:46    

GrosBocdel a écrit :

Je l'ai pris de la doc de gcc. Ca n'existe pas chez bilou?


 
 
pas vérifié, mais de toutes facons, une telle option va ajouter un set de warnings au compilateur, alors que je n'en cherche qu'un seul...
J'esperais que quelqu'un connissait son code... apparemment non, ou personne ne s'est encore manifesté  :)

Reply

Marsh Posté le 10-10-2006 à 17:48:19    

bein écoute, la doc de gcc dit ça à propose de -Wreorder :

Citation :


-Wreorder (C++ uniquement)
    Avertir quand l'ordre des initialiseurs de membres fournis dans le code ne correspond pas à l'ordre dans lequel ils doivent être exécutés. Par exemple :
 
            struct A {
              int i;
              int j;
              A(): j (0), i (1) { }
            };
 
 
    Ici, le compilateur avertira que les initialiseurs de membres pour i et j seront réarrangés pour qu'ils correspondent à l'ordre de déclaration des membres.  


Donc je ne vois pas en quoi ça rajoutera d'autres warnings.

Reply

Marsh Posté le 10-10-2006 à 18:23:39    

he, c'est cool ca, je verifie si ca marche ;)

Reply

Marsh Posté le 10-10-2006 à 18:29:06    

Halalalala [:hotcat]
M'enfin c'est possible que ça ne marche que pour gcc

Reply

Marsh Posté le 10-10-2006 à 18:54:55    

en plusieurs étapes :
1/ activer tous les warnings (option /Wall)
2/ repérer le numéro de warning correspondant a ce que tu cherches
2b/ si pas trouver : DTC
3/ utiliser l'option /wen ou /won ( http://msdn2.microsoft.com/en-us/library/thxezb7y.aspx )

Reply

Marsh Posté le 11-10-2006 à 09:53:04    

GrosBocdel a écrit :

Halalalala [:hotcat]
M'enfin c'est possible que ça ne marche que pour gcc


 
Hrem :P
 
/Wreorder n'existe pas sous Visual ^^
 
 

Reply

Marsh Posté le 12-10-2006 à 11:44:39    

KangOl a écrit :

en plusieurs étapes :
1/ activer tous les warnings (option /Wall)
2/ repérer le numéro de warning correspondant a ce que tu cherches
2b/ si pas trouver : DTC
3/ utiliser l'option /wen ou /won ( http://msdn2.microsoft.com/en-us/library/thxezb7y.aspx )


 
J'y ai pensé, mais activer Wall va generer une telle quantité de warnings que ca va etre trouver une aiguille dans une botte de foin... etant donnée la taille relativement enorme du projet sur lequel on bosse...

Reply

Marsh Posté le 12-10-2006 à 15:02:40    

taoa a écrit :

J'y ai pensé, mais activer Wall va generer une telle quantité de warnings que ca va etre trouver une aiguille dans une botte de foin... etant donnée la taille relativement enorme du projet sur lequel on bosse...


C'est pas comme si tu ne pouvais pas faire le test sur un simple fichier .cpp dans un nouveau projet :o

Reply

Marsh Posté le 13-10-2006 à 09:37:43    

Kristoph a écrit :

C'est pas comme si tu ne pouvais pas faire le test sur un simple fichier .cpp dans un nouveau projet :o


 
Mmmh :) tu veux pas le faire? :D j'ai deja plein de taff :P

Reply

Marsh Posté le 13-10-2006 à 09:53:48    

taoa a écrit :

Mmmh :) tu veux pas le faire? :D j'ai deja plein de taff :P


Nan, j'ai pas de Visual sous la main :D

Reply

Marsh Posté le 14-10-2006 à 11:20:54    

Bon, ok, je le conterai en heures sup'
 
Ah merde, elles sont pas payées les heures sup...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed