2009-10-19 7 views

risposta

19

AC non dovrebbe introdurre i nomi che non sono nello standard a meno che non seguono una alcune convenzioni di denominazione (come iniziare con un carattere di sottolineatura). Le versioni precedenti del compilatore di Microsoft non seguivano questa regola in modo particolarmente attento, ma col tempo Microsoft si stava muovendo maggiormente per rendere la loro implementazione più conforme agli standard. Quindi le funzioni che usavano per fornire che si intromettevano nello spazio dei nomi dell'utente che stavano implementando usando nomi che sono riservati alle implementazioni del compilatore e hanno deprecato i vecchi nomi.

Se _CRT_NONSTDC_NO_WARNINGS è definito, il compilatore MS non si lamenterà della deprecazione della funzione itoa(). Ma continuerà a lamentarsi del fatto che non è sicuro (devi definire _CRT_SECURE_NO_WARNINGS per mettere a tacere 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 v'è alcuna differenza se non nel nome.

8

Il MSDN documentation for itoa() dice:

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

+0

E 'solo i nomi che sono diversi, allora ?? – Polaris878

+0

questa risposta non si riferisce se _itoa e itoa sono la stessa funzione ... –

5

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 sta dicendo di usare _itoa per dirti che non è C++ standard e che devi contrassegnarlo come tale. Credo che sia qui per la retrocompatibilità e che questa notazione sia per la leggibilità e la distinzione.

4

itoa non è standard, quindi è consigliabile utilizzare stringstream.

avrete bisogno #include <sstream>

un esempio è l'uso sarebbe: implementazione libreria di runtime

int i = 5; 
std::stringstream ss; 

ss << i; 

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

Non trovo il motivo per cui dobbiamo usare uno stream con _itoa() o _itoa_s(). Penso che due alternative siano la scelta migliore che creare uno stream per convertire solo un numero in stringa. – HyLian

+1

itoa non è standard, puoi ancora usarlo. Assicurati solo che il compilatore che stai usando lo supporti. un modo per farlo è il modo giusto di farlo. – Corey

+0

No, è il modo in C++ di farlo, ed essere C++ non significa che sia giusto. –

1

In risposta alla risposta di Bruce:

itoa non è standard, quindi si dovrebbe utilizzare stringstream invece.

avrete bisogno #include <sstream>

un esempio è l'uso sarebbe:

int i = 5; std::stringstream ss;

ss << i;

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

È inoltre possibile codificare la propria funzione itoa() invece

esempio:

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(); 
} 
Problemi correlati