使用atoi时的依赖和错误

Posted

技术标签:

【中文标题】使用atoi时的依赖和错误【英文标题】:Dependencies and errors when using atoi 【发布时间】:2014-06-23 14:11:43 【问题描述】:

我的任务是重构一个非常古老的项目,而在最近几天我正在检查可执行文件的依赖关系,因为由于某些原因,它们自 2009 年以来发生了变化,从 4 变为 14。更具体地说,我的工作是保持 2009 年之前的依赖关系,但代码的更改一直持续到今天。

我找到了导致问题的指令。这是项目使用的库中的一个函数:

chain(str, pps)
    char *pps;
    char *str;

    int pp = 0;
    pp = atoi(pps);
    // ic sunt leones.

如果我用 0、1 或 3 之类的整数赋值来注释或替换 atoi,则库编译正常,但使用此 .lib 的可执行文件会给我以下错误:

nafxcw.lib(wincore.obj) : 错误 LNK2001: 无法解析的外部符号 __imp__InitCommonControls@0 nafxcw.lib(wincore.obj) : 错误 LNK2001: 无法解析的外部符号 __imp__DragAcceptFiles@8 nafxcw.lib(appcore.obj) : 错误 LNK2001: 无法解析的外部符号 _ClosePrinter@4 nafxcw.lib(appcore.obj):错误 LNK2001:无法解析的外部符号 _DocumentPropertiesA@24 nafxcw.lib(appcore.obj) : 错误 LNK2001: 无法解析的外部符号 _OpenPrinterA@12 nafxcw.lib(filecore.obj) : 错误 LNK2001: 无法解析的外部符号 __imp__SHGetFileInfoA@20 nafxcw.lib(filecore.obj) : error LNK2001: unresolved external symbol _GetFileTitleA@12

否则,如果我使用不同的值进行赋值,例如 2、4 或每隔一个整数,则一切都可以正确编译并正常工作。

有什么建议吗?这里发生了什么事?为什么会有这种奇怪的行为?

编辑:显然问题不在于 atoi。如果我使用自制函数来执行任何操作并接受 char* 并返回 int 或直接用 int 替换函数链的第二个参数并直接分配它,我仍然会收到相同的错误。

【问题讨论】:

“我的工作是保持 2009 年之前的依赖关系,但代码的更改一直持续到今天”——听起来你需要找一份新工作。软件更改 - 试图在这种时间范围内保持静态可能是一场失败的战斗,或者是各种安全/性能/功能灾难的秘诀...... 建议:与 /VERVOSE 链接,包括错误和解决方法,并区分跟踪。很有可能会出现有用的东西。 【参考方案1】:

你可以试试这个:

include ('limits.h');

int my_getnbr(char *str)

  int   i;
  long  nbr;
  int   neg;

  neg = 0;
  nbr = 0;
  i = 0;
  if (str[0] == '-')
    
      neg = 1;
      str++;
    
  while (str[i] >= '0' && str[i] <= '9')
    
      nbr = nbr * 10 + (str[i++] - '0');
      if (nbr > INT_MAX)
    return (0);
    
  return (neg ? (int)nbr * -1 : (int)nbr);

这只是一个自制的atoi之类的。

编辑:由 Alter Mann 编写的 INT_MAX。 编辑之二:如果 (nbr > INT_MAX) 再次由 Alter Mann :)

【讨论】:

永远不要使用2147483647INT_MAXlimits.h中定义 if ((!neg &amp;&amp; nbr &gt; INT_MAX) || (neg &amp;&amp; nbr &gt; INT_MAX))if (nbr &gt; INT_MAX)是一样的,同样你需要控制一个以str[0] == '+'开头的字符串;) 感谢您的建议,但我已经尝试过使用自制的 atoi,我什至尝试将函数的第二个参数直接替换为 int,但结果是相同的。 :( PS:我已经编辑了问题以避免使用自定义 atoi 回答,据我所知,不幸的是问题不是 atoi :(【参考方案2】:

我能想到的唯一一件事是简化的函数正在被编译不存在,然后链接器很有帮助地假设库中没有可链接的代码,因此它被删除了,不幸的是是唯一强制包含这些 MFC 库的东西。

我不知道为什么它甚至需要 OpenPinter 之类的东西——它包含在 winspool.h(通过 windows.h)中,只是说听起来你有一个基于 MFC 的令人讨厌的混乱需要解决。由于它依赖于以特定顺序指定的特定包含,因此它从来都不是很好的 WRT 整洁构建。

【讨论】:

以上是关于使用atoi时的依赖和错误的主要内容,如果未能解决你的问题,请参考以下文章

strconv.Atoi() 给定字符串时抛出错误

c语言中atoi编译错误的问题

自定义库名称与系统库相同时的CMake循环依赖错误

如何修复“调用‘atoi’没有匹配的函数”错误?

atoi(str) 中的段错误

C ++ Atoi函数给出错误[重复]