2009-10-19 8 views

Odpowiedz

19

AC nie ma wprowadzać nazw, które nie są w normie, jeśli nie zastosują się do pewna konwencja nazewnictwa (jak zaczynając od podkreślenia). Wcześniejsze wersje kompilatora Microsoftu nie ściśle przestrzegały tej zasady, ale z biegiem czasu Microsoft dążył do tego, aby ich implementacja była bardziej zgodna ze standardami. Tak więc funkcje, które były używane do dostarczania, mogłyby zakłócać przestrzeń nazw użytkownika, którą implementują, używając nazw zarezerwowanych dla implementacji kompilatora i powodujących wycofywanie starych nazw.

Jeśli zdefiniowano _CRT_NONSTDC_NO_WARNINGS, kompilator MS nie będzie narzekał na wycofanie funkcji itoa(). Ale nadal będzie narzekać na to, że jest niebezpieczne (musisz zdefiniować _CRT_SECURE_NO_WARNINGS, aby wyciszyć to ostrzeżenie). Lub użyj bezpieczniejszą wersję funkcji (_itoa_s()), która zapewnia funkcję z wielkością bufora docelowego

Zarówno _itoa() i itoa() resolve do tej samej funkcji w bibliotece w dół do tego samego adresu - nie ma różnicy z wyjątkiem Nazwa.

8

MSDN documentation for itoa() mówi:

Ta funkcja POSIX jest przestarzała początek w Visual C++ 2005. Zastosowanie ISO C++ conformant _itoa lub bezpieczeństwa wspomagane _itoa_s zamiast.

+0

jest to tylko nazwy, które są różne wtedy ?? – Polaris878

+0

ta odpowiedź nie dotyczy tego, czy _itoa i itoa mają tę samą funkcję ... –

5

itoa nie jest standardem C

„Ta funkcja jest określona w ANSI-C i nie jest częścią C++, ale jest obsługiwany przez niektóre kompilatory”. - cplusplus.com

Tak więc MSVS informuje użytkownika, aby użył _itoa do poinformowania, że ​​nie jest standardowym C++ i że należy oznaczyć go jako taki. Uważam, że jest tam kompatybilność wsteczna i że ta notacja służy czytelności i rozróżnieniu.

4

itoa nie jest standardem, więc powinieneś użyć strumienia łańcuchowego.

musisz #include <sstream>

przykładem jej użycia może być: realizacja biblioteka czasu pracy

int i = 5; 
std::stringstream ss; 

ss << i; 

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

Nie wiem, dlaczego musimy użyć strumienia zawierającego _itoa() lub _itoa_s(). Myślę, że dwie alternatywy to lepszy wybór, który tworzy strumień, który konwertuje tylko liczbę na łańcuch. – HyLian

+1

itoa nie jest standardem, nadal można z niego korzystać. Tylko upewnij się, że kompilator, którego używasz, obsługuje go. Strumień jest po prostu prawidłowym sposobem robienia tego. – Corey

+0

Nie, jest to sposób C++, a bycie w C++ nie oznacza, że ​​jest poprawne. –

1

W odpowiedzi na odpowiedź przez Bruce:

itoa nie jest standardem, więc należy użyć stringstream zamiast.

musisz #include <sstream>

przykładem jest to stosowanie byłoby:

int i = 5; std::stringstream ss;

ss << i;

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

Można również kodować własną itoa() funkcję zamiast

np

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(); 
} 
Powiązane problemy