Domanda

Visual Studio sta urlando contro di me sull'utilizzo itoa() dicendo di usare _itoa() invece?

Sembra a me come se fossero la stessa funzione. Ciò che dà?

È stato utile?

Soluzione

Un'implementazione libreria C Tempo di esecuzione non dovrebbe introdurre i nomi che non sono nello standard a meno che non seguono una certa convenzione di denominazione (come iniziare con un carattere di sottolineatura). Le versioni precedenti di compilatore di Microsoft non hanno seguito questa regola con particolare attenzione, ma nel tempo, Microsoft si è mossa più verso rendendo la loro applicazione più conforme agli standard. Quindi le funzioni hanno usato per la fornitura che sarebbe intromettersi nella spazio dei nomi dell'utente sono state implementando l'utilizzo di nomi che sono riservati per le implementazioni compilatore e sono stati deprecando i vecchi nomi.

Se _CRT_NONSTDC_NO_WARNINGS è definito, il compilatore MS non sarà lamentano la funzione itoa() essere sconsigliato. Ma sarà ancora lamentano che sia non sicuro (è necessario definire _CRT_SECURE_NO_WARNINGS per calmare quell'avvertimento). Oppure utilizzare la versione più sicura della funzione (_itoa_s()), che fornisce la funzione con la dimensione del buffer di destinazione

Sia _itoa() e itoa() volontà di esattamente la stessa funzione nella libreria verso il basso per lo stesso indirizzo - non c'è differenza se non nel nome

.

Altri suggerimenti

Il documentazione MSDN per itoa() dice:

  inizio

Questa funzione POSIX è sconsigliata in Visual C ++ 2005. Utilizzare l'ISO C ++ _itoa conforme o _itoa_s protezione avanzata, invece.

itoa non è standard C.

"Questa funzione non è definita in ANSI-C e non è parte di C ++, ma è supportato da alcuni compilatori." - cplusplus.com

Quindi MSVS ti dice di usare il _itoa per dirvi che non è standard C ++ e che si dovrebbe contrassegnare come tale. Credo che è lì per la compatibilità a ritroso e che questa notazione è per la leggibilità e distinzione.

itoa non è standard, così si dovrebbe usare stringstream posto.

è necessario #include <sstream>

un esempio del suo utilizzo potrebbe essere:

int i = 5;
std::stringstream ss;

ss << i;

std:: cout << ss.str();

In risposta alla risposta di Bruce:

  

itoa non è standard, così si dovrebbe usare stringstream posto.

     

è necessario #include <sstream>

     

un esempio del suo utilizzo potrebbe essere:

     

int i = 5;   std::stringstream ss;

     

ss << i;

     

std:: cout << ss.str();

È anche possibile codificare la propria funzione itoa() invece

es:

const char* itoa (int num)
{
    if (num == 0)
    {
        return "0";
    }
    bool neg = false;
    if (num < 0)
    {
        neg = true;
        num = -num;
    }

    int digits = 0;
    int tmp = num;

    while (tmp > 0)
    {
        digits++;
        tmp /= 10;
    }

    int digs[digits];

    for (tmp = digits; num > 0; tmp--)
    {
        digs[tmp] = num % 10;
        num /= 10;
    }

    string s = neg == true ? "-" : "";
    for (tmp = 1; tmp <= digits; tmp++)
    {
        s += (char)(digs[tmp] + 48);
    }
    return s.c_str();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top