¿Cuál es la causa de la advertencia: declaración implícita de la función 'swprintf_s'?

Me pregunto por qué mi uso de swprintf_s está generando la advertencia del enlazador warning: implicit declaration of function 'swprintf_s'

Tengo estos encabezados:

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <windows.h>
#include <tchar.h>

Y también debes

LPCWSTR foo = L"É %s";
LPCWSTR arg = "bá";
LPCWSTR msg = malloc(wcslen((wchar_t*)foo) + wcslen((wchar_t*)arg) + 1);
swprintf_s(msg, (wchar_t*)foo, (wchar_t*)arg);

¿Cómo puedo arreglar esto?

preguntado el 12 de junio de 12 a las 17:06

hmm De acuerdo a los docs deberías conseguirlo con stdio.h. -

¿Qué versión de Visual C++ estás usando? -

@Jacobo - swprintf_s es una adición de Microsoft, no se incluye con GCC o libc. -

1 Respuestas

Todas las _s funciones (swprintf_s, memcpy_s) son adiciones de Microsoft. Son parte de la biblioteca C de Microsoft. Cuando use GCC, terminará usando una biblioteca C diferente, que no incluye las adiciones de Microsoft (pero puede incluir sus propias adiciones). Microsoft llama a su biblioteca C "CRT" o "C runtime", los usuarios de GCC se refieren a ella como "libc" o incluso "glibc" (que es una implementación específica).

Si observa una lista de funciones en la biblioteca C estándar de Microsoft (Documentos de MSDN), con un ojo agudo notará una cantidad bastante grande de funciones no estándar. La mayoría de estos son parte de las "mejoras de seguridad" de Microsoft (Documentos de MSDN). En general, recomiendo evitar las mejoras de seguridad ya que no son portátiles y no son necesarias para escribir código seguro.

Solución: Puedes usar el swprintf en lugar de swprintf_s. La swprintf La función es parte del estándar C, por lo que está presente en muchas implementaciones (aunque debe evitarse en plataformas que no sean Windows, ya que utiliza wchar_t).

LPCWSTR foo = L"É %s";
LPCWSTR arg = L"bá";
size_t msgbuflen = wcslen(foo) + wcslen(arg) + 1;
LPCWSTR msg = malloc(len);
if (!msg) error...;
swprintf(msg, msgbuflen, foo, arg);

Tenga en cuenta que LPCWSTR es solo un typedef elegante para const wchar_t *, por lo que no es necesario enviarlo a wchar_t *.

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.