gpt4 book ai didi

'strtold' 的冲突类型

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:03 24 4
gpt4 key购买 nike

我运行 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

最佳答案

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

之前我也说不准为什么不报错。您在 13 年前的操作系统上使用 12 年前的编译器。

如果您自己实现 strtold,可能这是因为它不存在。通常,您希望运行一个配置程序来探测系统的功能并生成一个头文件,其中包含诸如 #define HAS_STRTOLD 之类的定义。然后您可以使用 #ifndef HAS_STRTOLD 包装您的兼容性版本。

您的代码中可能确实有这样的内容。在旧机器上它找到了 strtold 而在新机器上它没有。新机器上的探针可能坏了。

关于 'strtold' 的冲突类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com