【问题标题】:C Error: undefined reference to '_itoa'C 错误:未定义对“_itoa”的引用
【发布时间】:2011-03-25 04:43:22
【问题描述】:

我正在尝试将整数转换为字符以写入文件,使用此行:

fputc(itoa(size, tempBuffer, 10), saveFile);

我收到此警告和消息:

警告: 'itoa' 的隐式声明

对“_itoa”的未定义引用

我已经包含了 stdlib.h,并且正在编译:

gcc -Wall -pedantic -ansi

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我猜 itoa 可能不存在于您正在使用的标准 C 库中。您可以尝试指定标志 -fpermissive 以查看代码是否有效。
  • “官方”标准库中没有itoa这样的功能。显然您使用的标准库不提供itoa。您的 -pedantic-ansi 标志将无济于事。恰恰相反,他们实际上可以通过隐藏非标准函数使事情变得更糟(我不知道他们是否真的这样做)。尝试不使用它们进行编译。

标签: c itoa


【解决方案1】:

itoa 不是标准的一部分。我怀疑-ansi 阻止你使用它,或者它根本不可用。

我建议使用sprintf()

如果你使用 c99 标准,你可以使用snprintf(),这当然更安全。

char buffer[12];
int i = 20;
snprintf(buffer, 12,"%d",i);

【讨论】:

  • 您需要更大的缓冲区来处理负号。
  • @RocketRoy 实际上只是一个例子。示例中的值20 正好适合char[10],这就是OP 使用的缓冲区大小。但是是的,有符号的 32 位 int 需要 char[12] 来处理符号和 \0
  • @BrianRoach 虽然你是完全正确的,但为了喜欢复制粘贴的人,我在示例中更改了缓冲区的大小。
  • 布赖恩的原始回答说明了事情的真相。假设int 适合 12 字节的字符串是完全不正确的,如果作为事实发布,它可能会误导人们。例如,在 AVR 8 位系统上,'int's 通常是 16 位(2 字节)。
【解决方案2】:

这里告诉你在编译阶段itoa是未知的:

警告:隐式声明 'itoa'

因此,如果您的系统上存在此函数,则您缺少声明它的头文件。然后编译器假设它是一个接受不特定数量的参数并返回int的函数。

来自加载器阶段的这条消息

对“_itoa”的未定义引用

解释说加载器在他知道的任何库中都没有找到这样的函数。

所以你或许应该听从 Brian 的建议,用标准函数替换 itoa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多