防止使用整数进行自动转换
Posted
技术标签:
【中文标题】防止使用整数进行自动转换【英文标题】:Preventing automatic casts with integers 【发布时间】:2013-08-07 15:54:43 【问题描述】:我正在开发一个音频应用程序(在 C++ 中),并且我有很多相互调用的函数,它们要么获取帧数(即 1 个单声道或 2 个立体声浮点样本),要么获取原始样本数......
越来越难以跟踪每个函数(样本或帧?)的语义以及何时通过 nChannels 进行 mult 或 div,所以我想以某种方式执行 typedef samples_t 和 frames_t(到 unsigned int)并拥有编译器帮帮我...
是否有任何简单的方法可以将从 frames_t 到 samples_t 的隐式转换标记为 C++ 中的错误?
【问题讨论】:
对于 C++,您可能会发现这很有用:boost.org/doc/libs/1_54_0/doc/html/boost_units/Quick_Start.html. Enforce strong type checking in C (type strictness for typedefs) 或 Is there a good way to force type incompatibility in C? 的可能重复项。 @OliCharlesworth:您可以使用 «release» 代替 Boost 版本,该版本始终会将您带到最新稳定版本的文档(推荐方式) 这里也在讨论:***.com/questions/3140035/… 作为一个以编写这种代码为生并且从未遇到过这个问题的开发人员,我冒昧地建议您也许是在问错误的问题/以错误的方式解决这个问题。其他选项是对帧或样本进行标准化,而不是有时使用一个,其他时间使用另一个,或者使用一种数据结构来承载原始样本数据以及采样数据的样本和帧数,然后传递该结构。 【参考方案1】:您可以全力以赴在boost.units 中定义自己的系统,或者只使用BOOST_STRONG_TYPEDEF
宏为每种类型创建一个强类型定义。
【讨论】:
【参考方案2】:除非 frames_t 和 samples_t 实际上是不同的类型。您可以将它们设为包含整数的 POD 结构,但对它们进行类型定义不会有任何效果。
【讨论】:
Whole Value 成语,对吧? martin-moene.blogspot.co.uk/2012/07/light-on-whole-value.html 不是最漂亮的解决方案,但它实际上工作得很好......现在我至少可以保护最敏感的代码(处理堆栈从一个切换到另一个)并且我设法赶上大多数烦人的错误(很难追踪,因为它们通过播放声音和一半或两倍的速度表现出来)【参考方案3】:typedef
无法做到这一点,但 boost 可以帮助你。
如果您想要的只是不可转换的类型,BOOST_STRONG_TYPEDEF
可以解决问题:它允许您组成多个类型,这些类型都是 unsigned
,但在传递时彼此之间不可转换。
但在您的特定应用程序中,您可能希望考虑升压单位框架,您可以在其中实际创建单位类型,其中算术结果继承适当的单位(例如freq * time
产生无单位)。
【讨论】:
以上是关于防止使用整数进行自动转换的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值