5 votes

visual studio swprintf fait que tous mes formateurs %s veulent wchar_t * au lieu de char *.

J'ai un projet multiplateforme qui compile très bien sur mac, mais sur Windows tous mes appels swprintf avec un %s cherchent un wchar_t au lieu du char * que je lui passe. Il s'avère que M$ a pensé qu'il serait amusant de faire en sorte que %s signifie autre chose que char * dans les fonctions de caractères larges... http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx

Quoi qu'il en soit, je cherche une astuce de codage créative qui soit meilleure que de mettre des ifdef else ends autour de chaque appel de chaîne large.

4voto

Anders Points 34448

Mise à jour : VS 2015 CTP6 a annulé les changements et Microsoft agit encore une fois différemment de la norme.


Visual Studio 14 CTP1 et plus tard traitera toujours %s comme une chaîne étroite ( char* ), sauf si vous définissez _CRT_STDIO_LEGACY_WIDE_SPECIFIERS . Il a également ajouté l'extension modificatrice de la longueur T qui correspond à ce que MS appelle la largeur "naturelle". Pour sprintf %Ts es char* et pour swprintf %Ts est wchar_t* .


Dans Visual Studio 13 et les versions antérieures %s / %c est mappé à la largeur naturelle de la chaîne de fonction/format et %S / %C est mis en correspondance avec l'opposé du naturel avec :

printf("%c %C %s %S\n", 'a', L'B', "cd", L"EF");
wprintf(L"%c %C %s %S\n", L'a', 'B', L"cd", "EF");

Vous pouvez également forcer une largeur spécifique en utilisant un modificateur de longueur : %ls , %lc , %ws y %wc signifie toujours wchar_t y %hs y %hc sont toujours char . (documenté pour VS2003 aquí et VC6 aquí (Pas sûr pour %ws et quand il a été vraiment ajouté))

Cartographie %s à la largeur naturelle de la fonction était vraiment pratique à l'époque de Win9x contre WinNT, en utilisant la fonction tchar.h en-tête vous pourriez construire des sorties étroites et larges à partir de la même source. Quand _UNICODE sont définies les fonctions dans tchar.h correspondent aux fonctions larges et TCHAR es wchar_t sinon, les fonctions étroites sont utilisées et TCHAR es char :

_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd"));

Une convention similaire est utilisée par les fichiers d'en-tête du SDK Windows et les quelques fonctions de formatage qui y existent (wsprintf, wvsprintf, wnsprintf et wvnsprintf) mais elles sont contrôlées par UNICODE y TEXT et non _UNICODE y _T / _TEXT .

Vous avez probablement trois possibilités pour faire fonctionner un projet multiplateforme sous Windows si vous voulez prendre en charge les anciens compilateurs Windows :

1) Compilez comme un projet de chaîne étroite sous Windows, probablement pas une bonne idée et dans votre cas, swprintf traitera toujours %s comme wchar_t*.

2) Utilisez des définitions personnalisées, de manière similaire au fonctionnement des chaînes de format inttypes.h :

#ifdef _WIN32
#define PRIs "s"
#define WPRIs L"hs"
#else
#define PRIs "s"
#define WPRIs L"s" 
#endif
printf("%" PRIs " World\n", "Hello");
wprintf(L"%" WPRIs L" World\n", "Hello");

3) Créez votre propre version personnalisée de swprintf et utilisez-la avec Visual Studio 13 et les versions antérieures.

2voto

Neil Points 24938

Utilisez le %ls ce qui signifie toujours wchar_t* .

2voto

paveo Points 21

Vous pouvez utiliser le spécificateur de format "%Ts" ou vous pouvez définir _CRT_STDIO_LEGACY_WIDE_SPECIFIERS=1.

Lisez ceci :

http://blogs.msdn.com/b/vcblog/archive/2014/06/18/crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X