我在不同的平台上测试GNU扩展功能,比如"wcstoq“。首先,我没有用D_GNU_SOURCE,so编译这个测试用例--我收到了如下编译警告:
wcstoq.c:31:12: warning: implicit declaration of function 'wcstoq'; did you mean 'wcstol'? [-Wimplicit-function-declaration]
retval=wcstoq(nptr,endptr,base);
^~~~~~
wcstol当我使用gdb调试这个测试用例时,它会进入与我定义的_GNU_SOURCE相同的正确函数。但是当我没有定义_GNU_SOURCE时,这个函数就出错了。
例如:
当我在x86_64中测试超出范围的情况时,它应该设置retval= LLONG_MAX(0x7FFFFFFFFFFFFFFF),但实际上它设置了retval= -1(0xFFFFFFFFFFFFFFFF)。这个结果也让我感到困惑,当我在其他平台上测试它时,它实际上设置了retval=0x000000007FFFFFFF。当我定义_GNU_SOURCE时,函数在x86_64和ppc中运行ok,它都返回LLONG_MAX(0x7FFFFFFFFFFFFFFF)。
我的问题是:
为什么我没有定义_GNU_SOURCE,但是gcc仍然可以找到正确的函数?
2为什么连gcc都找不到正确的功能,在某些情况下仍然可以使用,但在另一些情况下却出错了?
3为什么不同平台的功能失效结果是不同的,架构平台或其他因素如何影响不同的结果?
4正确使用GNU扩展函数?
泰克斯!
发布于 2018-11-22 21:32:15
隐式函数声明是默认启用的GCC扩展,它使用返回类型int,但是函数被定义为返回long long。有了这种类型的错配,任何事情都可能发生。在实践中,结果取决于调用约定,这就是它们在不同体系结构中不同的原因。
您确实应该使用-Werror=implicit-function-declaration进行编译(或者使用C++)。隐式函数声明在近20年前从C中删除(在ISO/IEC 9899:1999中),但我们仍然不能更改GCC的默认值,因为太多的自动many检查会中断,导致软件意外地失去功能。
(我认为你的意思是在你的问题中写retval,而不是errno。)
https://stackoverflow.com/questions/53277504
复制相似问题