Visual Studio кричит на меня по поводу использования itoa()
вместо этого говорит использовать _itoa()
?
Мне кажется, что это одна и та же функция. Что дает?
Visual Studio кричит на меня по поводу использования itoa()
вместо этого говорит использовать _itoa()
?
Мне кажется, что это одна и та же функция. Что дает?
Реализация библиотеки времени выполнения C не должна вводить имена, которых нет в стандарте, если они не следуют определенному соглашению об именах (например, начинаются с подчеркивания). Более ранние версии компилятора Microsoft не следовали этому правилу особенно строго, но со временем Microsoft все больше двигалась к тому, чтобы их реализация в большей степени соответствовала стандартам. Таким образом, функции, которые они использовали для предоставления, которые вторгались бы в пространство имен пользователя, которые они реализовывали, используя имена, зарезервированные для реализаций компилятора, и устарели от старых имен.
Если _CRT_NONSTDC_NO_WARNINGS
определено, компилятор MS не будет жаловаться на то, что функция itoa()
устарела. Но он все равно будет жаловаться на то, что он небезопасен (вы должны определить _CRT_SECURE_NO_WARNINGS
, чтобы отключить это предупреждение). Или используйте более безопасную версию функции (_itoa_s()
), которая предоставляет функции размер целевого буфера.
И _itoa()
, и itoa()
разрешаются в одну и ту же функцию в библиотеке по одному и тому же адресу — разницы нет, кроме имени.
В документации MSDN для itoa()
говорится:
Эта функция POSIX устарела, начиная с Visual C++ 2005. Вместо нее используйте
_itoa
, совместимую с ISO C++, или_itoa_s
с повышенной безопасностью.
itoa не является стандартным C.
«Эта функция не определена в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами». - cplusplus.com
Таким образом, MSVS говорит вам использовать _itoa, чтобы сообщить вам, что это не стандартный C++ и что вы должны пометить его как таковой. Я считаю, что это сделано для обратной совместимости и что это обозначение предназначено для удобочитаемости и отличия.
itoa
не является стандартным, поэтому вместо него следует использовать stringstream.
вам понадобится #include <sstream>
пример его использования:
int i = 5;
std::stringstream ss;
ss << i;
std:: cout << ss.str();
В ответ на ответ Брюса:
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();
}
string
, потому что возвращаемый указатель может также указывать на строковый литерал. C++ - это не Java.
- person chqrlie; 18.09.2018