首页 > 解决方案 > 结合常量后缀和可移植数据类型

问题描述

这似乎是一个愚蠢的问题,会让我失去一些声誉分数,但我仍然渴望收到关于这个问题的反馈——

我从事的几乎所有项目(嵌入式系统),无论是专有驱动程序还是第三方库,都包含这两个概念:

第一个概念是在常量定义中使用UL后缀(也UUL),例如:

#define BIT_0 0x1UL
#define BIT_1 0x2UL

第二个概念是将可移植类型用于变量声明和函数参数,例如:

uint32_t func (uint32_t input1);

突然间它击中了我,尽管我和我的同事几乎习惯于在常量中添加UL(and ULL) 后缀,并为变量使用可移植类型,两者的结合(例如,如果这样的常量将被分配给、操作与可移植变量或与可移植变量相比)实际上是错误的,因为第一个概念是不可移植的(long在不同系统上的长度可能会有所不同),而第二个概念是。

我的问题是——我的启蒙错了吗?这两个概念的结合真的是好的编程吗?还是我是对的,我们使用这两个概念的事实是缺乏知识的结果?

标签: c

解决方案


不,你没有错。硬编码“抽象”类型的后缀unsigned long与使用具有指定宽度的更具体类型不太兼容。

有时人们只知道映射,这无论如何都可以使它正确,但它不那么便携或干净。

您可以将宏用于文字,请参阅<stdint.h>

  • 宏 INT N _C 应扩展为对应于类型的整数常量表达式int_leastN_t(例如INT32_C(4711)生成与 兼容的常量int32_t)。
  • UINT N _C() 也一样。

推荐阅读