我被赋予了重构一个非常古老的项目的任务,并且在这些日子里我正在检查可执行文件的依赖性,因为出于某些原因,它们自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替换函数链的第二个参数并直接分配它仍然会收到相同的错误。答案 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整洁版本从来都不是很好。