2009-08-18 6 views
6

Pourquoi je reçois l'avertissement suivant pour le code suivant :)Microsoft warning _stprintf

code:

_stprintf(m_szFileNamePath,_T("%s"),strFileName); 

avertissement C4996: '_swprintf': swprintf a été modifiée pour être conforme à la norme ISO C standard, en ajoutant un paramètre de nombre de caractères supplémentaire. Pour utiliser Microsoft swprintf traditionnel, définissez _CRT_NON_CONFORMING_SWPRINTFS.

Je sais que _strprintf est une macro qui si _UNICODE est définie va évaluer à _swprintf sinon elle sera sprintf.

Maintenant qu'est ce que c'est _swprintf. Il y a une fonction swprintf, mais pourquoi _stprintf évalue-t-il à _swprintf au lieu de swprintf.

Quelle est la différence avec les fonctions _xxx et xxx?

EDIT:

D'accord, il y a deux définitions pour la version UNICODE de _stprintf, lequel est inclus?

Celui dans tchar.h ou strsafe.h?

+0

Demandez-vous au sujet _stprintf ou _strprintf, ou quoi? S'il vous plaît modifier votre question pour être cohérent. –

+0

Je demande à propos de _stprintf, c'était une faute de frappe – akif

Répondre

5

http://msdn.microsoft.com/en-us/library/ybk95axf%28VS.80%29.aspx

swprintf est une version grand caractère de sprintf; les arguments de pointeur vers swprintf sont des chaînes de caractères larges. La détection des erreurs de codage dans swprintf peut différer de celle de sprintf. swprintf et fwprintf se comportent de manière identique sauf que swprintf écrit la sortie sur une chaîne plutôt que sur une destination de type FILE, et swprintf requiert le paramètre count pour spécifier le nombre maximum de caractères à écrire. Les versions de ces fonctions avec le suffixe _l sont identiques, sauf qu'elles utilisent le paramètre locale transmis à la place des paramètres régionaux de threads en cours. Dans Visual C++ 2005, swprintf est conforme à la norme ISO C, qui requiert le deuxième paramètre, count, de type size_t. Pour forcer l'ancien comportement non standard, définissez _CRT_NON_CONFORMING_SWPRINTFS. Dans une version future, l'ancien comportement peut être supprimé, le code doit donc être modifié pour utiliser le nouveau comportement conforme.

+0

Pourquoi donne-t-il alors l'avertissement? – akif

+3

L'avertissement ne l'explique-t-il pas? Parce qu'ils ont changé le comportement. Les gens aiment généralement savoir quand le code ne fait pas ce qu'ils attendent. ;) – jalf

0

Microsoft fournit sa propre extension du CRT _swprintf - n'est pas compatible (par exemple) avec unix

0

Microsoft (utilisé pour?) Préfixe par ailleurs des fonctions largement disponibles non win32 qui ne faisaient pas partie de la norme C avec un trait de soulignement.

+0

D'accord, il y a deux définitions pour la version UNICODE de _stprintf, dont une est incluse ???? Celui dans tchar.h ou strsafe.h? – akif

1

Peut-être que cela?

_stprintf(m_szFileNamePath, 256, _T("%s"), strFileName); 
0

Cela devrait fonctionner

int len = swprintf(buf, 100, L"%s", L"Hello world");