使用atoi时的依赖关系和错误

Dependencies and errors when using atoi

本文关键字:关系 错误 依赖 atoi 使用      更新时间:2023-10-16

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

我找到了引起问题的指令。它是项目使用的库中的一个函数:
chain(str, pps)
    char *pps;
    char *str;
{
    int pp = 0;
    pp = atoi(pps);
    // ic sunt leones.

如果我注释或替换atoi与一个整数的赋值,如0,1或3,库编译正常,但使用这个。lib的可执行文件给我这些错误:

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

如果我使用不同的值赋值,如2、4或其他整数,一切都可以正确编译并工作。

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

编辑:显然问题不在于atoi。如果我使用一个自制的函数来做任何事情,接受一个char*并返回一个int,或者直接用int替换函数链的第二个形参并直接赋值,我仍然会收到相同的错误。

你可以试试:

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);
}

这只是一个家里做的玩具。

编辑:INT_MAX by Alter Mann。编辑bis: if (nbr> INT_MAX) by Alter Mann again:)

我唯一能想到的是简化的函数被编译不存在,然后链接器有用地假设库中没有代码可以链接,因此它被丢弃,不幸的是它是唯一强迫包括那些MFC库的东西。

我不知道为什么它甚至需要像OpenPinter这样的东西-它包含在winspool.h(通过windows.h)中,除了说它听起来像你有一个讨厌的基于mfc的混乱来排序。由于它依赖于以特定顺序指定的特定包含,因此它从来都不是很好的WRT整洁构建。