none
Mise à jour Visual Studio et caractères étendus... RRS feed

  • Question

  • Bonsoir,

    Hier j'ai fais une mise à jour de Visual Studio et du coup, à la compilation il y a l'erreur C4996

    Pour moi, c'est du chinois...

    Le code corrigé lors de ma question précédente avec votre aide!!!

      std::wifstream fichier(p_NomF);
      fichier.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
      wstring l_LigneTxt = wstring();
      std::getline(fichier, l_LigneTxt);
      std::getline(fichier, l_LigneTxt);  

    L'erreur survient sur la ligne fichier.imbue(...

    1>c:\devgp79\libgeomgp79\libgeomgp79\fichierdxf.cpp(61): error C4996: 'std::codecvt_utf8<wchar_t,1114111,0>':

    warning STL4017: std::wbuffer_convert, std::wstring_convert, and the <codecvt> header (containing std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and std::codecvt_utf8_utf16) are deprecated in C++17.

    (The std::codecvt class template is NOT deprecated.)

    The C++ Standard doesn't provide equivalent non-deprecated functionality; consider using MultiByteToWideChar() and WideCharToMultiByte() from <Windows.h> instead.

    You can define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

    1>c:\devgp79\libgeomgp79\libgeomgp79\fichierdxf.cpp(61):

    note: voir la déclaration de 'std::codecvt_utf8<wchar_t,1114111,0>'
    1>c:\devgp79\libgeomgp79\libgeomgp79\fichierdxf.cpp(61):

    error C4996: 'std::codecvt_utf8<wchar_t,1114111,0>::codecvt_utf8':

    warning STL4017: std::wbuffer_convert, std::wstring_convert, and the <codecvt> header (containing std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and std::codecvt_utf8_utf16) are deprecated in C++17.

    (The std::codecvt class template is NOT deprecated.)

    The C++ Standard doesn't provide equivalent non-deprecated functionality; consider using MultiByteToWideChar() and WideCharToMultiByte() from <Windows.h> instead.

    You can define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

    1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\codecvt(47):

    note: voir la déclaration de 'std::codecvt_utf8<wchar_t,1114111,0>::codecvt_utf8'
    1>TopoSelectArcDG.cpp

    Si quelqu'un peut m'aider

    Cordialement

    Gérard

    jeudi 14 décembre 2017 21:22

Réponses

  • Votre parade est un peu bourrin et va peut-être cacher une forêt de bugs derrière.

    >Il s'agit bien d'une erreur comme marqué à la première ligne:

    Vous avez vraisemblablement activé l'option qui fait considérer les "warnings" comme des "errors".

    >Le message est assez incohérent (de mon point de vue)

    Heu, pour moi, je le trouve plutôt explicite.

    Qu'est-ce qui est incohérent dans ce message ?

    >Alors par quoi remplacer ces arguments?

    Les arguments, c'est pour une fonction, ici elle est obsolète, contrairement à la classe la définissant.

    J'ai l'impression qu'il y a ce qu'il faut juste dans la classe codecvt, non ?

    http://en.cppreference.com/w/cpp/locale/codecvt


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse GP79 mardi 19 décembre 2017 15:17
    lundi 18 décembre 2017 09:35
    Modérateur

Toutes les réponses

  • Attention, ce n'est pas une "erreur", c'est un "warning", un avertissement.

    https://msdn.microsoft.com/fr-fr/library/ttcz0bys.aspx?f=255&MSPPError=-2147217396

    C'est assez difficile de vous aidez plus que le message d'avertissement qui vous indique la cause de ce warning et un moyen assez bourrin de s'en débarrassé si vous ne voyez pas de manière élégante de ne plus utiliser la fonctionnalité qui est dépréciée (donc plus disponible dans quelques années).

    Ne paniquez pas et lisez attentivement le message d'avertissement. ;-)


    Paul Bacelar, Ex - MVP VC++

    vendredi 15 décembre 2017 09:54
    Modérateur
  • Bonjour Paul,

    J'ai trouvé une parade

    Dans les propriétés->Language

    J'ai supprimé le respect de la norme C++17 et je n'ai plus d'erreur.

    Il s'agit bien d'une erreur comme marqué à la première ligne:

    1>c:\devgp79\libgeomgp79\libgeomgp79\fichierdxf.cpp(61): error C4996:

    Le compilateur s'arrête.

    Le message est assez incohérent (de mon point de vue)

    Les arguments de la fonction sont obsolètes

    std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and std::codecvt_utf8_utf16

    Mais la classe n'est pas obsolète!!!

    Alors par quoi remplacer ces arguments?

    En supprimant le respect de la norme c++17, ça fonctionne, mais si on veut que le compilateur respect cette norme par quoi remplacer les arguments ou quelle autre fonction utiliser?

    La suggestion d'utiliser

    MultiByteToWideChar() and WideCharToMultiByte() from windows.h tombe mal, ce projet est une librairie statique sans référence aux entêtes Microsoft...

    Cordialement

    Gérard

    vendredi 15 décembre 2017 10:27
  • Votre parade est un peu bourrin et va peut-être cacher une forêt de bugs derrière.

    >Il s'agit bien d'une erreur comme marqué à la première ligne:

    Vous avez vraisemblablement activé l'option qui fait considérer les "warnings" comme des "errors".

    >Le message est assez incohérent (de mon point de vue)

    Heu, pour moi, je le trouve plutôt explicite.

    Qu'est-ce qui est incohérent dans ce message ?

    >Alors par quoi remplacer ces arguments?

    Les arguments, c'est pour une fonction, ici elle est obsolète, contrairement à la classe la définissant.

    J'ai l'impression qu'il y a ce qu'il faut juste dans la classe codecvt, non ?

    http://en.cppreference.com/w/cpp/locale/codecvt


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse GP79 mardi 19 décembre 2017 15:17
    lundi 18 décembre 2017 09:35
    Modérateur
  • Merci Paul

    J'ai remplacé le code litigieux par celui ci

    std::wcout.imbue(std::locale(std::locale::empty(), new std::codecvt<wchar_t, char, std::mbstate_t>()));

    J'ai réintroduit le respect de la norme c++17 et je n'ai plus d'erreur.

    Ca n'a pas résolu mon problème pour autant. Il faut que je me penche un peu plus sur la référence que vous avez indiquée.

    Cordialement

    Gérard

    mardi 19 décembre 2017 15:20