В чем разница между _itoa и itoa?

Visual Studio кричит на меня по поводу использования itoa() вместо этого говорит использовать _itoa()?

Мне кажется, что это одна и та же функция. Что дает?


person Polaris878    schedule 19.10.2009    source источник


Ответы (5)


Реализация библиотеки времени выполнения C не должна вводить имена, которых нет в стандарте, если они не следуют определенному соглашению об именах (например, начинаются с подчеркивания). Более ранние версии компилятора Microsoft не следовали этому правилу особенно строго, но со временем Microsoft все больше двигалась к тому, чтобы их реализация в большей степени соответствовала стандартам. Таким образом, функции, которые они использовали для предоставления, которые вторгались бы в пространство имен пользователя, которые они реализовывали, используя имена, зарезервированные для реализаций компилятора, и устарели от старых имен.

Если _CRT_NONSTDC_NO_WARNINGS определено, компилятор MS не будет жаловаться на то, что функция itoa() устарела. Но он все равно будет жаловаться на то, что он небезопасен (вы должны определить _CRT_SECURE_NO_WARNINGS, чтобы отключить это предупреждение). Или используйте более безопасную версию функции (_itoa_s()), которая предоставляет функции размер целевого буфера.

И _itoa(), и itoa() разрешаются в одну и ту же функцию в библиотеке по одному и тому же адресу — разницы нет, кроме имени.

person Michael Burr    schedule 19.10.2009

В документации MSDN для itoa() говорится:

Эта функция POSIX устарела, начиная с Visual C++ 2005. Вместо нее используйте _itoa, совместимую с ISO C++, или _itoa_s с повышенной безопасностью.

person Greg Hewgill    schedule 19.10.2009
comment
Только названия другие?? - person Polaris878; 19.10.2009
comment
этот ответ не касается того, являются ли _itoa и itoa одной и той же функцией... - person Matt Joiner; 21.10.2009

itoa не является стандартным C.

«Эта функция не определена в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами». - cplusplus.com

Таким образом, MSVS говорит вам использовать _itoa, чтобы сообщить вам, что это не стандартный C++ и что вы должны пометить его как таковой. Я считаю, что это сделано для обратной совместимости и что это обозначение предназначено для удобочитаемости и отличия.

person Robert Massaioli    schedule 19.10.2009

itoa не является стандартным, поэтому вместо него следует использовать stringstream.

вам понадобится #include <sstream>

пример его использования:

int i = 5;
std::stringstream ss;

ss << i;

std:: cout << ss.str();
person Corey    schedule 19.10.2009
comment
Я не понимаю, почему мы должны использовать поток с _itoa() или _itoa_s(). Я думаю, что две альтернативы лучше, чем создание потока только для преобразования числа в строку. - person HyLian; 19.10.2009
comment
itoa не является стандартным, вы все равно можете его использовать. Просто убедитесь, что используемый вами компилятор поддерживает это. stringstream - это правильный способ сделать это. - person Corey; 19.10.2009
comment
Нет, это способ сделать это на С++, и то, что это С++, не означает, что это правильно. - person Matt Joiner; 21.10.2009

В ответ на ответ Брюса:

itoa не является стандартным, поэтому вместо него следует использовать stringstream.

вам понадобится #include <sstream>

пример его использования:

int i = 5; std::stringstream ss;

ss << i;

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

Вместо этого вы также можете написать свою собственную функцию itoa().

eg:

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();
}
person kotarou3    schedule 27.10.2009
comment
Эта функция неэффективна, непереносима и расточительна: вызывающий объект не может правильно отбросить память, выделенную для string, потому что возвращаемый указатель может также указывать на строковый литерал. C++ - это не Java. - person chqrlie; 18.09.2018