介绍

cdecl中有这样的枚举:

enum cdecl_show {
  cdecl_show_predefined       = 1 typedef enum cdecl_show cdecl_show_t;

其值是可以按位或在一起的位置标志。

标志在这里的作用并不重要,但简单地说,它们控制响应 cdecl show 显示什么类型的命令?

我在努力增强 show 如果命令行为使用户定义类型未显示具体名称,则通过以下代码显示具有相同名称的预定义类型(如有):

if ( !showed_any && (show & cdecl_show_user_defined) != 0 ) {
  show &= ~cdecl_show_user_defined;
  sho

首页 2024-07-11 22:28:10

= cdecl_show_predefined; // ... }

即关闭cdecl_show_user_defined 并打开cdecl_show_predefined 位。 问题是,当使用符号转换编译器选项进行编译时,我得到:

show.c:244:8: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-wsign-conversion]
  show &= ~cdecl_show_user_defined;
       ~~ ^~~~~~~~~~~~
1 warning generated.

这是因为 c 中枚举值隐式转换为其基本类型(这里是 int),但 ~ 将其操作数转换为无符号 int。

消除警告的明显方法是先转化为 unsigned:

  show &= ~(unsigned)cdecl_show_user_defined;  // no warning

问题是,在 c23 之前的 c 在语言中,你无法确定枚举的底层类型是什么。 来自 c11 标准 §6.7.2.2 ?4:

每种类型的枚举应与之相匹配 char、与符号整数类型或无符号整数类型兼容。定义了类型的选择。

如果你不知道基本的类型是什么,特别是它的大小,你就不知道 unsigned int 正确选择无符号类型,因为你想匹配大小。

鉴于 cdecl_show 只有值 1、2 和 4.可以肯定的是,其基本类型是 int — 但你不能确定。 我们需要的是一种与给定表达式类型大小相同的无符号类型的方法。

解决方案

使用 _generic 和 static_if (在那篇文章中给出),我们可以实现:

#define to_unsigned(n)                    \
  static_if( sizeof(n) == sizeof(char),   \
    (unsigned char)(n),                   \
  static_if( sizeof(n) == sizeof(short),  \
    (unsigned short)(n),                  \
  static_if( sizeof(n) == sizeof(int),    \
    (unsigned int)(n),                    \
  static_if( sizeof(n) == sizeof(long),   \
    (unsigned long)(n),                   \
    (unsigned long long)(n) ) ) ) )

其中 n 它是任何整数或枚举类型的数值表达式。 实现非常简单:使用 static_if 链条来确定表达式 n 类型的大小,然后将其转换为相同大小的无符号类型。

鉴于此,我现在可以写了:

  show &= ~TO_UNSIGNED( CDECL_SHOW_USER_DEFINED );

而且没有警告。

结论

再次,_generic 允许您在编译过程中自省一些类型。 to_unsigned() 其优点是,即使底层类型发生变化,也始终有效。

除了对枚举有用外,它还适用于整形类型 typedef 它也很有用,因为你永远不需要找到它 typedef 知道转换为哪种无符号类型的基本类型。

以上是转换为相同尺寸的无符号类型的详细内容。请多关注其他相关文章!


p

最新文章

  • 轻松掌握!电脑文字复制粘贴全攻略解释:此标题简短且直接,符合20字以内的要求,同时没有使用双引号,以“轻松掌握”表达了

  • 介绍

    cdecl中有这样的枚举:

    enum cdecl_show {
      cdecl_show_predefined       = 1 typedef enum cdecl_show cdecl_show_t;
    

    其值是可以按位或在一起的位置标志。

    标志在这里的作用并不重要,但简单地说,它们控制响应 cdecl show 显示什么类型的命令?

    我在努力增强 show 如果命令行为使用户定义类型未显示具体名称,则通过以下代码显示具有相同名称的预定义类型(如有):

    if ( !showed_any && (show & cdecl_show_user_defined) != 0 ) {
      show &= ~cdecl_show_user_defined;
      sho

  • Go 对框架错误处理机制的比较-Golang

  • Win10文件备份,关键位置轻松掌握!

  • 哪种C 框架最适合开发跨平台Web应用程序?-C

  • 个人主机,轻松变身高效服务器!

  • 哪种C 移动开发最适合可穿戴设备的框架?-C

  • 相关文章

  • Go 对框架错误处理机制的比较-Golang

  • 哪种C 框架最适合开发跨平台Web应用程序?-C

  • 哪种C 移动开发最适合可穿戴设备的框架?-C

  • 云原生开发中golang框架的成本和效率如何?-Golang

  • Python 理解初学者指南-Python教程

  • 新闻称网易和 Krafton IT行业就荒野行动等游戏版权纠纷达成和解

  • 香港交通和物流局建议,非法经营网上叫车被定罪者吊销一年驾照——IT行业

  • 菜鸟快递宣布在广州率先升级同城快递服务:半天送货,价格降半-IT行业

  • 低代码赋能塔吊设备管理:加快工程机械智能化进程-IT行业

  • 百度网盘下载太慢怎么办?常见问题

  • 如何用百度网盘加好友-常见问题

  • 百度网盘如何存储文档-常见问题