2009-08-18 14 views
6

¿Por qué me sale el siguiente aviso para el siguiente código :)Microsoft advertencia _stprintf

Código:

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

C4996 advertencia: '_swprintf': swprintf se ha modificado para ajustarse a la norma ISO C estándar, agregando un parámetro adicional de conteo de caracteres. Para usar swprintf de Microsoft tradicional, configure _CRT_NON_CONFORMING_SWPRINTFS.

Sé que _strprintf es una macro que si se define _UNICODE se evaluará a _swprintf de lo contrario será sprintf.

Ahora, ¿qué es este _swprintf. Existe una función swprintf, pero ¿por qué _stprintf evalúa a _swprintf en lugar de swprintf?

¿Cuál es la diferencia b/w de las funciones _xxx y xxx?

EDIT:

bien hay dos definiciones para la versión Unicode de _stprintf, que se incluye uno?

¿El uno en tchar.h o strsafe.h?

+0

lo preguntas sobre _stprintf o _strprintf, o qué? Por favor edite su pregunta para ser consistente. –

+0

pregunto por _stprintf, que fue un error tipográfico – akif

Respuesta

5

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

swprintf es una versión de caracteres anchos de sprintf; los argumentos del puntero a swprintf son cadenas de caracteres anchos. La detección de errores de codificación en swprintf puede diferir de la de sprintf. swprintf y fwprintf se comportan de manera idéntica, excepto que swprintf escribe salida en una cadena en lugar de en un destino de tipo FILE, y swprintf requiere que el parámetro de recuento especifique la cantidad máxima de caracteres que se escribirá. Las versiones de estas funciones con el sufijo _l son idénticas, excepto que utilizan el parámetro de configuración regional pasado en lugar de la configuración regional de la secuencia actual.

En Visual C++ 2005, swprintf cumple con el estándar ISO C, que requiere el segundo parámetro, count, del tipo size_t. Para forzar el antiguo comportamiento no estándar, defina _CRT_NON_CONFORMING_SWPRINTFS. En una versión futura, el comportamiento anterior puede eliminarse, por lo que el código debe cambiarse para usar el nuevo comportamiento conforme.

+0

¿Por qué está dando la advertencia? – akif

+3

¿La advertencia no explica eso? Porque han cambiado el comportamiento. A la gente generalmente le gusta saber cuándo el código no hace lo que espera. ;) – jalf

0

Microsoft proporciona su propia extensión de la CRT _swprintf - no es compatible (por ejemplo) con UNIX

0

Microsoft (utilizado para?) Prefijo de otra manera ampliamente disponibles funciones que no son Win32 que no formaban parte de la norma C con guion bajo

+0

Está bien, hay dos definiciones para la versión UNICODE de _stprintf, ¿cuál está incluida? ¿El que está en tchar.h o strsafe.h? – akif

1

Quizás esto?

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

Esto debería funcionar

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