'strtold'的类型冲突

时间:2018-10-14 00:12:22

标签: c centos

我运行MUD(用C编码),并将其迁移到新服务器上。我在两个(和相同的Makefile)上都运行了相同版本的gcc,但是在编译时在新服务器上却出现错误:

/usr/bin/gcc34 -c -g -g3 -Wall    -DREQUESTS -DSMAUG14  -DTIMEFORMAT -DREGEX build.c
build.c:33: error: conflicting types for 'strtold'
/usr/include/stdlib.h:178: error: previous declaration of 'strtold' was here

该行:

long double     strtold         args( ( const char *string, const char **endstring) );

新服务器上的stdlib.h行:

extern long double strtold (__const char *__restrict __nptr,
                        char **__restrict __endptr)

在stdlib.h上,旧服务器上同一目录中的同一行:

extern long double strtold (__const char *__restrict __nptr,
                        char **__restrict __endptr)

但是旧服务器没有收到此编译错误。旧服务器gcc:

[user@old src]# /usr/bin/gcc34 -v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,f77 --disable-libgcj --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-4.1)

新服务器gcc:

[user@new src]$ /usr/bin/gcc34 -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,f77 --disable-libgcj --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-19.el6)

请注意,args是:

 #define args( list )                    ( )

我在这里想念什么?如果代码,gcc版本和Makefile相同,那可能指向另一个库?

更新:运行gcc -E开始揭示一些旧服务器:

3946.   extern long double __strtold_internal (__const char *__restrict __nptr,
3947.              char **__restrict __endptr,
3948.              int __group)
3949.        __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))) ;

新服务器:

4525.   extern long double strtold (__const char *__restrict __nptr,
4526.          char **__restrict __endptr)
4527.        __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))) ;

显然stdlib.h不同。即使我具有相同的gcc版本,是否有任何方法可以在新服务器上复制旧库以确保此迁移顺利进行?

我还注意到库中strtold extern上方的这一点:

#ifdef  __USE_ISOC99
__BEGIN_NAMESPACE_C99

相关吗? http://www-01.ibm.com/support/docview.wss?uid=swg21455370

1 个答案:

答案 0 :(得分:3)

您的签名不匹配。您的定义具有const char *, const char **,但stdlib.h具有const char *, char **。请注意,它们的第二个参数不是恒定的。解决该问题,它可能会起作用。

为什么在我不能说之前没有出错。您正在13年的操作系统上使用12年的编译器。

如果对于您自己的strtold实现,大概是这样,以防不存在。通常,您要运行一个配置程序,该程序会探测系统的功能并生成带有诸如#define HAS_STRTOLD之类的定义的头文件。然后,您可以使用#ifndef HAS_STRTOLD包装兼容版本。

您的代码可能确实有类似这样的内容。在旧计算机上找到strtold,而在新计算机上找不到。探针可能在新机器上坏了。