10

Visual Studio 对我大喊大叫,itoa()说要改用say to use _itoa()

在我看来它们是相同的功能。是什么赋予了?

4

5 回答 5

23

AC 运行时库实现不应该引入不在标准中的名称,除非它们遵循特定的命名约定(例如以下划线开头)。微软编译器的早期版本并没有特别严格地遵循这条规则,但随着时间的推移,微软一直在朝着使其实现更符合标准的方向发展。因此,他们过去提供的函数会侵入他们一直在使用为编译器实现保留的名称实现的用户命名空间,并且一直在弃用旧名称。

如果_CRT_NONSTDC_NO_WARNINGS已定义,则 MS 编译器不会抱怨该itoa()函数已被弃用。但它仍然会抱怨它不安全(您必须定义_CRT_SECURE_NO_WARNINGS以消除该警告)。或者使用_itoa_s()提供目标缓冲区大小的函数的更安全版本的函数 ( )

两者都_itoa()itoa()库中的完全相同的函数解析为相同的地址 - 除了名称之外没有区别。

于 2009-10-19T05:57:48.540 回答
8

MSDN 文档itoa()说:

从 Visual C++ 2005 开始不推荐使用此 POSIX 函数。改用符合 ISO C++_itoa或安全性增强的函数_itoa_s

于 2009-10-19T02:52:18.803 回答
5

itoa 不是标准 C.

“此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但某些编译器支持。” - cplusplus.com

因此,MSVS 告诉您使用 _itoa 来告诉您它不是标准 C++,您应该将其标记为标准。我相信它的存在是为了向后兼容,并且这种符号是为了可读性和区别。

于 2009-10-19T02:53:45.150 回答
4

itoa不是标准的,因此您应该改用 stringstream 。

你需要#include <sstream>

它的使用示例是:

int i = 5;
std::stringstream ss;

ss << i;

std:: cout << ss.str();
于 2009-10-19T03:03:47.253 回答
1

回复布鲁斯的回答:

itoa不是标准的,因此您应该改用 stringstream 。

你需要#include <sstream>

它的使用示例是:

int i = 5; std::stringstream ss;

ss << i;

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

您也可以编写自己的itoa()函数

例如:

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();
}
于 2009-10-27T10:00:32.243 回答