sprintf_s non è stato dichiarato in questo ambito
Domanda
Ho un programma C che utilizza sprintf_s
. Funziona bene in Windows, ma quando compilo il mio codice in Linux dà questo errore:
sprintf_s was not declared in this scope.
Perché accade questo e come posso risolvere il problema?
Soluzione
Non è normale, non troverete tale funzione su Linux.
funzione standard snprintf
dovrebbe avere una semantica simile.
Altri suggerimenti
sprintf_s non fa parte della libreria standard C, quindi non è portatile, quindi non si è in grado di utilizzarlo in Linux. Ma tu hai snprintf, che è molto simile e dovrebbe aiutare a realizzare ciò che si desidera.
sprintf_s
non fa parte della libreria standard C, e non sarà in grado di utilizzarlo in Linux.
Tuttavia, snprintf
è standard e dovrebbe fare la stessa operazione.
sprintf_s
è solo una parte dell'allegato K, un opzionale Allegato per lo standard C11:
Allegato K
...
K.2 Ambito
- Il presente allegato specifica una serie di opzionale le estensioni che possono essere utili nella mitigazione dei vulnerabilità di sicurezza nei programmi, e comprendono nuove funzioni, macro e tipi dichiarati o definiti in intestazioni standard esistenti.
...
K.3.5.3.6 funzione I sprintf_s
Sinossi
#define __STDC_WANT_LIB_EXT1__1 #include <stdio.h> int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);
(enfasi aggiunta)
Non è mai fatto in POSIX (o Linux) (e non è mancato a tutti, ci sono anche argomenti su sua utilità nel comitato).
Per una migliore portabilità, utilizzare snprintf
che fa parte dello standard core e fornisce tutte le funzionalità di cui ha bisogno.
snprintf è insicuro, sprintf_s solo è sicuro. snprintf non garantisce per aggiungere una finale \ 0, portando a possibili overflow successivi. guarda https://github.com/rurban/safeclib per una corretta applicazione.
Nel corso di un porting del mio programma da Windows a Linux, ho scritto a seguito dell'attuazione nel mio windows.h:
inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}