首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当未定义_GNU_SOURCE时如何运行

当未定义_GNU_SOURCE时如何运行
EN

Stack Overflow用户
提问于 2018-11-13 09:13:55
回答 1查看 73关注 0票数 1

我在不同的平台上测试GNU扩展功能,比如"wcstoq“。首先,我没有用D_GNU_SOURCE,so编译这个测试用例--我收到了如下编译警告:

代码语言:javascript
运行
复制
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扩展函数?

泰克斯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53277504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档