Visual Studio et Visual Studio Code comportement différent pour le même code

Le problème exposé dans ce sujet a été résolu.

Salut à tous et toutes :),

Je débute en programmation et j’aimerais avoir vos avis et par la même occasion poser un problème.

Pour coder j’utilise visual studio d’une part et visual studio code d’une autre part à fin de faire des comparaisons et, voire ce qui est mieux. Pour le moment je ne suis pas encore fixé et prendre une décision devient avec le temps de plus en plus difficile, car les deux ont parfois pour le même code des comportements différents. J’aimerais donc savoir quel serait selon vous le mieux adapté.

Par différence de comportement, je veux souligner le fait que pour le même code visual studio Code me renvoie des erreurs ou avertissements et visual studio pas. Voici quelques exemples et j’aimerais savoir comment résoudre ces problèmes.

  • Pour le code suivant VS Code me renvoie un message d’avertissement alors que visual studio non. En modifiant les niveaux des erreurs à signaler dans visual studio, je réussis à avoir un avertissement pour la ligne 4, mais pas pour la 5.
#include <iostream>
using namespace std;
int main(){
    std::cout << "C:\Program Files (x86)" << std::endl;
    std::cout << 'ab' << std::endl;
    return 0;
}
  • Pour le code suivant le find_if_not des ligne 10 a 13 n’est pas reconnu dans VS Code mais celui de la ligne 16 ci.le message d’erreur est no matching function for call to 'find_if_not(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)'. En enlevant la ligne using namespace std;, l’erreur disparait. Dans Visual Studio, avec ou sans la ligne using namespace std; je ne recois pas d’erreur.
#include <iostream>
#include <string> 
#include <array>   
#include <algorithm> 

using namespace std;
int main(){

    std::string text{"Text avec espace. "};
    auto deb { std::find_if_not(std::begin(text), std::end(text),isspace)};
    auto fi { std::find_if_not(std::rbegin(text), std::rend(text),isspace)};
    std::string::iterator deb1 { std::find_if_not (std::begin(text), std::end(text),isspace)};
    std::string::iterator fi1 { std::find_if_not (std::begin(text), std::end(text),isspace)};

    std::array<int,5> foo = {1,2,3,4,5};
    std::array<int,5>::iterator ita { std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} )};
    return 0;
}
  • Pour le code suivant, dans VS Code je reçois l’erreur 'const' qualifiers cannot be applied to 'int&'à cause de la ligne 8. Dans Visual Studio par contre non. Ici je suis très perturbé car je cherche a créer une référence constante sur un entier. Si je ne me trompe pas il faut lire de la droite vers la gauche. Ce qui selon moi devrait donner pour & const une référence constante et cela associé a int, une référence constante sur un entier.
#include <iostream>
int main(){
    int entier{ 40 };
    int& reference_entier{ entier };
    reference_entier += 2;
    int const entier_constant{ 0 };
    int const& reference_const_entier_constant{ entier_constant };
    int& const ref{ entier };
    return 0;
}

Je tiens à ajouter que mes projets sous Visual Studio 2019 sont paramétrés comme indiqué dans ce cours : https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/le-debut-du-voyage/5210_le-minimum-pour-commencer/#visual-studio-community. Pour visual studio code j’utilise le compilateur minGW W64 version 12.2.0.

Merci pour votre temps et en avance pour vos retours.

Kev_k

Le problème vient du fait que les compilateurs ont des options par défaut différentes. Et donc vont être plus ou moins tolérants aux erreurs.

Par exemple, ton 3ème code, mingw, clang et msvc détectent tous les 3 le problème avec const (donc aucun doute que ce const est une erreur de syntaxe). La différence est que les 2 premiers considèrent que c’est une erreur et refusent de compiler. Le 3ème ignore le const avec un message d’avertissement :

<source>(8): warning C4227: anachronism used: qualifiers on reference are ignored

Pour ça qu’il est important d’activer les options de compilation. Tu peux regarder ce projet pour les options à activer : https://github.com/jonathanpoelen/cpp-compiler-options. Sans cela, on a plus de risques d’avoir un code qui n’est pas compatible sur tous les compilateurs. Et pour les projets pro, il est courant de compiler avec plusieurs compilateurs différents.

Une règle importante aussi : il faut considérer les avertissements comme des erreurs. Surtout quand on débute. Un code ne doit pas être considéré comme valide tant qu’il y a des avertissements.

Pour ton premier code, il y a effectivement un problème aux lignes 4 et 5. Le problème des multicharacter literals, c’est que c’est implementation-defined (https://stackoverflow.com/questions/7755202/multi-character-constant-warnings), c’est a dire que chaque compilateur fait ce qu’il veut. Ca fait partie des problèmes de normalisation un peu con con du C++.

Le second code est encore plus complexe à comprendre. Il existe 2 fonctions isspace, une dans l’espace de noms std (https://en.cppreference.com/w/cpp/string/byte/isspace) et l’autre qui est dans l’espace de noms global (https://en.cppreference.com/w/c/string/byte/isspace). C’est un reliquat du C. La version avec std ne peut pas être utilisé directement (cf la doc, c’est expliqué). Il faut comprendre que le using namespace std ne dit pas au compilateur "utilise la version avec std" mais dit "tu peux aussi regarder dans std si tu trouves cette fonction". Avec using namespace std, le compilateur va donc trouver les 2 fonctions et ne saura pas laquelle utiliser. Sans le using namespace std, il ne trouve qu’une version la fonction et c’est bon.

C’est un exemple concret de pourquoi on déconseille les using namespace : pour éviter les conflits de noms.

Une autre solution est d’écrire explicitement que tu veux l’une des fonctions. Par exemple :

auto deb { std::find_if_not(std::begin(text), std::end(text), ::isspace)};

Je suis pas sur de comprendre pourquoi ce code est accepté sur msvc.

Mais tu touche l’un des problèmes de l’apprentissage du C++ : il y a une complexité inutile du fait de l’histoire du C++, des différents compilateurs, de la norme parfois étrange, des options par défaut, etc.

Mon conseil est juste de continuer avec l’éditeur qui te convient le plus, pour ton apprentissage. Et quand tu seras sur du code pro, d’utiliser des outils de build auto pour garantir la qualité du code.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte