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.