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

时间:2014-06-23 14:11:43

标签: c++ c visual-c++

我被赋予了重构一个非常古老的项目的任务,并且在这些日子里我正在检查可执行文件的依赖性,因为出于某些原因,它们自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):错误LNK2001:未解析的外部符号_GetFileTitleA @ 12

如果不然,我为赋值使用不同的值,比如2,4或每隔一个整数,一切都正确编译并起作用。

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

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

2 个答案:

答案 0 :(得分: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&gt; INT_MAX)由Alter Mann再次:)

答案 1 :(得分:0)

我能想到的唯一一件事就是简化的函数被编译出来了,然后链接器有助于假设在库中没有要链接的代码,所以它被删除了,不幸的是它唯一强迫的包括那些MFC库。

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