c - 结合常量后缀和可移植数据类型
问题描述
这似乎是一个愚蠢的问题,会让我失去一些声誉分数,但我仍然渴望收到关于这个问题的反馈——
我从事的几乎所有项目(嵌入式系统),无论是专有驱动程序还是第三方库,都包含这两个概念:
第一个概念是在常量定义中使用UL
后缀(也UUL
),例如:
#define BIT_0 0x1UL
#define BIT_1 0x2UL
第二个概念是将可移植类型用于变量声明和函数参数,例如:
uint32_t func (uint32_t input1);
突然间它击中了我,尽管我和我的同事几乎习惯于在常量中添加UL
(and ULL
) 后缀,并为变量使用可移植类型,两者的结合(例如,如果这样的常量将被分配给、操作与可移植变量或与可移植变量相比)实际上是错误的,因为第一个概念是不可移植的(long
在不同系统上的长度可能会有所不同),而第二个概念是。
我的问题是——我的启蒙错了吗?这两个概念的结合真的是好的编程吗?还是我是对的,我们使用这两个概念的事实是缺乏知识的结果?
解决方案
不,你没有错。硬编码“抽象”类型的后缀unsigned long
与使用具有指定宽度的更具体类型不太兼容。
有时人们只知道映射,这无论如何都可以使它正确,但它不那么便携或干净。
您可以将宏用于文字,请参阅<stdint.h>
:
- 宏 INT N _C 应扩展为对应于类型的整数常量表达式
int_leastN_t
(例如INT32_C(4711)
生成与 兼容的常量int32_t
)。 - UINT N _C() 也一样。
推荐阅读
- date - 如何在 Hive 查询中将“yyyy-m-dd”中的字符串日期转换为“yyyy-mm-dd”?
- python - 为什么我的 CSV 文件中的一列最终会在某些行上缩进,而在导入 Python 作为数据框时却没有?
- python - 如何修补功能,以便无需在电路板或微控制器上运行代码即可测试传感器数据?
- macos - 使用 AppleScript 的隐私选项卡
- pandas - 是否可以将 StyleFrame 附加到现有的 excel 工作表?
- firebase - 聊天视图中的重复消息。如何清除视图?
- python - 通过numpy数组索引和
- reactjs - React Hook Form 和 React Select 没有按预期工作
- javascript - 在 JavaScript 中,此方法称为什么,您可以在其中定义变量或属性,例如 variable_name$ref
- javascript - 使用 vue/vuetify 对自定义属性 CRUD 建模