当我执行这个问题的代码时,我得到了这个警告:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=] printf("PQ: %d, P: %d, Q: %d", (p - q), p, q); ~^ ~~~~~~~ %ld
作为reflection修复,我使用%ld
来打印两个指针的减法。 编制者同意了。
幸运的是,我看到另一位用户提到应该使用%td
的评论,因为减法的结果类型是ptrdiff_t
。 这个答案证实了这一说法。
现在从GCC的stddef.h头文件中,我可以看到这些类型在这种情况下是等价的:
typedef __PTRDIFF_TYPE__ ptrdiff_t; #define __PTRDIFF_TYPE__ long int
但是,我只是建议对OP的错误(或多或少)修复,使用%ld
而不是%td
。
有没有办法让我理解单独的编译器警告是不够的? 或者也许明智地解释警告本身,而不仅仅是反应。
我认为你不能说。 这取决于编译器编写器的意图/警告/智能。
也许他决定他总是支持%ld
预期%td
,或者他可能只是不知道/不能/不愿意提供更详细/正确的消息。 如有疑问,您的最后手段是标准。
这似乎不是一个可移植的构造,对于“正统”,你应该支持两种格式说明符。
这里的关键是:首先不要在printf
中进行任何forms的算术运算。 从GUI分离算法。
诸如printf("%d", p - q)
是非常危险的,不仅因为你可能在逻辑上得到错误的类型,而且因为C可能“帮你一个忙”并通过隐式类型提升默默地改变类型。 例子 。
此外,大多数编译器不会警告错误的格式说明符。 这是C历史上相对较新的事情,因为编译器不需要在此处显示诊断消息。 这只是gcc的一个额外function。
如何避免错误? 这些function本身就很危险 – 就是这样,人人都知道。 printf&scanf系列函数可能是编程史上编写的最有害的函数,就人类造成的总bug成本而言。 所以你应该怎么做:
以上就是c/c++开发分享如何明智地解释这个编译器警告?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560412.html