首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消未经检查的转换警告

取消未经检查的转换警告
EN

Stack Overflow用户
提问于 2021-08-10 08:36:28
回答 3查看 305关注 0票数 3

我有一段代码:

代码语言:javascript
复制
with Ada.Unchecked
private package MyPackage is
    function UC_Bool_To_U8 is new Ada.Unchecked_Conversion (Source => Boolean, Target => T_U8);
end MyPackage;

其中T_U8是:

代码语言:javascript
复制
type T_U8 is range 0 .. 2**7;

函数UC_Bool_To_U8正在工作,但我在编译时有警告:

警告:未选中的转换类型有不同的大小。 警告:“布尔”的大小为1,"T_U8“的大小为8 警告:源将以7个高阶零位进行扩展

我怎样才能抑制这些警告?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-10 11:10:19

可以使用如下Ada Gem博客文章和下面的示例中所示的杂注来抑制警告:

main.adb

代码语言:javascript
复制
with Ada.Unchecked_Conversion;

procedure Main is

   --  Using a modular type instead of an integer type. Result is the same.
   type T_U8 is mod 2**7;    
   
   pragma Warnings (Off, "types for unchecked conversion have different sizes");   
   
   function UC_Bool_To_U8 is new Ada.Unchecked_Conversion
     (Source => Boolean, Target => T_U8);
   
   pragma Warnings (On, "types for unchecked conversion have different sizes");
   
begin
   null;
end Main;

但是,在将布尔类型转换为整数或模块类型时,也请考虑不要使用Unchecked_Conversion。编译器将完全优化一个简单的if-statement,如编译器资源管理器中所示。

编译器资源管理器输入

代码语言:javascript
复制
pragma Source_File_Name (To_U8, Body_File_Name => "example.adb");

with Interfaces.C.Extensions;

function To_U8 (B : Boolean) return Interfaces.C.Extensions.Unsigned_8 with Inline is
begin
    return (if B then 1 else 0);
end To_U8;

编译器资源管理器的输出(使用编译器开关-O1-O2)

代码语言:javascript
复制
_ada_to_u8:
        mov     eax, edi  # b, tmp86
        ret  
票数 6
EN

Stack Overflow用户

发布于 2021-08-11 08:55:18

你为什么要在那里进行未经检查的转换?好呀

代码语言:javascript
复制
   function UC_Bool_To_U8 (Value : Boolean) return T_U8
     is (Boolean'Pos (Value));

为不同大小的类型创建未检查的转换是不安全的/不可移植的,所以我认为编译器警告是公平的。我建议你修正代码,而不是解除警告。

票数 5
EN

Stack Overflow用户

发布于 2021-08-13 09:58:47

虽然很容易隐藏一个警告,但我建议你采取不同的方式。

创建一个大小相同的数字类型,然后转换为所需的类型:

代码语言:javascript
复制
type T_U1 is range 0 .. 1 with Size => 1;
function UC_Bool_To_U1 (Value : Boolean) return T_U1 is new Ada.Unchecked_Conversion
 (Source => Boolean, Target => T_U1);
function UC_Bool_To_U8 (Value : Boolean) return T_U8 is (
    T_U8 (UC_Bool_To_U1 (Value))
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68723504

复制
相关文章

相似问题

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