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; shoGo 对框架错误处理机制的比较-Golang
Win10文件备份,关键位置轻松掌握!
哪种C 框架最适合开发跨平台Web应用程序?-C
个人主机,轻松变身高效服务器!
哪种C 移动开发最适合可穿戴设备的框架?-C
相关文章
Go 对框架错误处理机制的比较-Golang
哪种C 框架最适合开发跨平台Web应用程序?-C
哪种C 移动开发最适合可穿戴设备的框架?-C
云原生开发中golang框架的成本和效率如何?-Golang
Python 理解初学者指南-Python教程
新闻称网易和 Krafton IT行业就荒野行动等游戏版权纠纷达成和解
香港交通和物流局建议,非法经营网上叫车被定罪者吊销一年驾照——IT行业
菜鸟快递宣布在广州率先升级同城快递服务:半天送货,价格降半-IT行业
低代码赋能塔吊设备管理:加快工程机械智能化进程-IT行业
百度网盘下载太慢怎么办?常见问题
如何用百度网盘加好友-常见问题
百度网盘如何存储文档-常见问题